1" Vim syntax file
2" Language:	Modula 2
3" Maintainer:	pf@artcom0.north.de (Peter Funk)
4"   based on original work of Bram Moolenaar <Bram@vim.org>
5" Last Change:	2001 May 09
6
7" For version 5.x: Clear all syntax items
8" For version 6.x: Quit when a syntax file was already loaded
9if version < 600
10  syntax clear
11elseif exists("b:current_syntax")
12  finish
13endif
14
15" Don't ignore case (Modula-2 is case significant). This is the default in vim
16
17" Especially emphasize headers of procedures and modules:
18syn region modula2Header matchgroup=modula2Header start="PROCEDURE " end="(" contains=modula2Ident oneline
19syn region modula2Header matchgroup=modula2Header start="MODULE " end=";" contains=modula2Ident oneline
20syn region modula2Header matchgroup=modula2Header start="BEGIN (\*" end="\*)" contains=modula2Ident oneline
21syn region modula2Header matchgroup=modula2Header start="END " end=";" contains=modula2Ident oneline
22syn region modula2Keyword start="END" end=";" contains=ALLBUT,modula2Ident oneline
23
24" Some very important keywords which should be emphasized more than others:
25syn keyword modula2AttKeyword CONST EXIT HALT RETURN TYPE VAR
26" All other keywords in alphabetical order:
27syn keyword modula2Keyword AND ARRAY BY CASE DEFINITION DIV DO ELSE
28syn keyword modula2Keyword ELSIF EXPORT FOR FROM IF IMPLEMENTATION IMPORT
29syn keyword modula2Keyword IN LOOP MOD NOT OF OR POINTER QUALIFIED RECORD
30syn keyword modula2Keyword SET THEN TO UNTIL WHILE WITH
31
32syn keyword modula2Type ADDRESS BITSET BOOLEAN CARDINAL CHAR INTEGER REAL WORD
33syn keyword modula2StdFunc ABS CAP CHR DEC EXCL INC INCL ORD SIZE TSIZE VAL
34syn keyword modula2StdConst FALSE NIL TRUE
35" The following may be discussed, since NEW and DISPOSE are some kind of
36" special builtin macro functions:
37syn keyword modula2StdFunc NEW DISPOSE
38" The following types are added later on and may be missing from older
39" Modula-2 Compilers (they are at least missing from the original report
40" by N.Wirth from March 1980 ;-)  Highlighting should apply nevertheless:
41syn keyword modula2Type BYTE LONGCARD LONGINT LONGREAL PROC SHORTCARD SHORTINT
42" same note applies to min and max, which were also added later to m2:
43syn keyword modula2StdFunc MAX MIN
44" The underscore was originally disallowed in m2 ids, it was also added later:
45syn match   modula2Ident " [A-Z,a-z][A-Z,a-z,0-9,_]*" contained
46
47" Comments may be nested in Modula-2:
48syn region modula2Comment start="(\*" end="\*)" contains=modula2Comment,modula2Todo
49syn keyword modula2Todo	contained TODO FIXME XXX
50
51" Strings
52syn region modula2String start=+"+ end=+"+
53syn region modula2String start="'" end="'"
54syn region modula2Set start="{" end="}"
55
56" Define the default highlighting.
57" For version 5.7 and earlier: only when not done already
58" For version 5.8 and later: only when an item doesn't have highlighting yet
59if version >= 508 || !exists("did_modula2_syntax_inits")
60  if version < 508
61    let did_modula2_syntax_inits = 1
62    command -nargs=+ HiLink hi link <args>
63  else
64    command -nargs=+ HiLink hi def link <args>
65  endif
66
67  HiLink modula2Ident		Identifier
68  HiLink modula2StdConst	Boolean
69  HiLink modula2Type		Identifier
70  HiLink modula2StdFunc		Identifier
71  HiLink modula2Header		Type
72  HiLink modula2Keyword		Statement
73  HiLink modula2AttKeyword	PreProc
74  HiLink modula2Comment		Comment
75  " The following is just a matter of taste (you want to try this instead):
76  " hi modula2Comment term=bold ctermfg=DarkBlue guifg=Blue gui=bold
77  HiLink modula2Todo		Todo
78  HiLink modula2String		String
79  HiLink modula2Set		String
80
81  delcommand HiLink
82endif
83
84let b:current_syntax = "modula2"
85
86" vim: ts=8
87