1" Vim syntax file
2" Language:		Haskell
3" Maintainer:		Haskell Cafe mailinglist <haskell-cafe@haskell.org>
4" Last Change:		2008 Dec 15
5" Original Author:	John Williams <jrw@pobox.com>
6"
7" Thanks to Ryan Crumley for suggestions and John Meacham for
8" pointing out bugs. Also thanks to Ian Lynagh and Donald Bruce Stewart
9" for providing the inspiration for the inclusion of the handling
10" of C preprocessor directives, and for pointing out a bug in the
11" end-of-line comment handling.
12"
13" Options-assign a value to these variables to turn the option on:
14"
15" hs_highlight_delimiters - Highlight delimiter characters--users
16"			    with a light-colored background will
17"			    probably want to turn this on.
18" hs_highlight_boolean - Treat True and False as keywords.
19" hs_highlight_types - Treat names of primitive types as keywords.
20" hs_highlight_more_types - Treat names of other common types as keywords.
21" hs_highlight_debug - Highlight names of debugging functions.
22" hs_allow_hash_operator - Don't highlight seemingly incorrect C
23"			   preprocessor directives but assume them to be
24"			   operators
25"
26" 2004 Feb 19: Added C preprocessor directive handling, corrected eol comments
27"	       cleaned away literate haskell support (should be entirely in
28"	       lhaskell.vim)
29" 2004 Feb 20: Cleaned up C preprocessor directive handling, fixed single \
30"	       in eol comment character class
31" 2004 Feb 23: Made the leading comments somewhat clearer where it comes
32"	       to attribution of work.
33" 2008 Dec 15: Added comments as contained element in import statements
34
35" Remove any old syntax stuff hanging around
36if version < 600
37  syn clear
38elseif exists("b:current_syntax")
39  finish
40endif
41
42" (Qualified) identifiers (no default highlighting)
43syn match ConId "\(\<[A-Z][a-zA-Z0-9_']*\.\)\=\<[A-Z][a-zA-Z0-9_']*\>"
44syn match VarId "\(\<[A-Z][a-zA-Z0-9_']*\.\)\=\<[a-z][a-zA-Z0-9_']*\>"
45
46" Infix operators--most punctuation characters and any (qualified) identifier
47" enclosed in `backquotes`. An operator starting with : is a constructor,
48" others are variables (e.g. functions).
49syn match hsVarSym "\(\<[A-Z][a-zA-Z0-9_']*\.\)\=[-!#$%&\*\+/<=>\?@\\^|~.][-!#$%&\*\+/<=>\?@\\^|~:.]*"
50syn match hsConSym "\(\<[A-Z][a-zA-Z0-9_']*\.\)\=:[-!#$%&\*\+./<=>\?@\\^|~:]*"
51syn match hsVarSym "`\(\<[A-Z][a-zA-Z0-9_']*\.\)\=[a-z][a-zA-Z0-9_']*`"
52syn match hsConSym "`\(\<[A-Z][a-zA-Z0-9_']*\.\)\=[A-Z][a-zA-Z0-9_']*`"
53
54" Reserved symbols--cannot be overloaded.
55syn match hsDelimiter  "(\|)\|\[\|\]\|,\|;\|_\|{\|}"
56
57" Strings and constants
58syn match   hsSpecialChar	contained "\\\([0-9]\+\|o[0-7]\+\|x[0-9a-fA-F]\+\|[\"\\'&\\abfnrtv]\|^[A-Z^_\[\\\]]\)"
59syn match   hsSpecialChar	contained "\\\(NUL\|SOH\|STX\|ETX\|EOT\|ENQ\|ACK\|BEL\|BS\|HT\|LF\|VT\|FF\|CR\|SO\|SI\|DLE\|DC1\|DC2\|DC3\|DC4\|NAK\|SYN\|ETB\|CAN\|EM\|SUB\|ESC\|FS\|GS\|RS\|US\|SP\|DEL\)"
60syn match   hsSpecialCharError	contained "\\&\|'''\+"
61syn region  hsString		start=+"+  skip=+\\\\\|\\"+  end=+"+  contains=hsSpecialChar
62syn match   hsCharacter		"[^a-zA-Z0-9_']'\([^\\]\|\\[^']\+\|\\'\)'"lc=1 contains=hsSpecialChar,hsSpecialCharError
63syn match   hsCharacter		"^'\([^\\]\|\\[^']\+\|\\'\)'" contains=hsSpecialChar,hsSpecialCharError
64syn match   hsNumber		"\<[0-9]\+\>\|\<0[xX][0-9a-fA-F]\+\>\|\<0[oO][0-7]\+\>"
65syn match   hsFloat		"\<[0-9]\+\.[0-9]\+\([eE][-+]\=[0-9]\+\)\=\>"
66
67" Keyword definitions. These must be patters instead of keywords
68" because otherwise they would match as keywords at the start of a
69" "literate" comment (see lhs.vim).
70syn match hsModule		"\<module\>"
71syn match hsImport		"\<import\>.*"he=s+6 contains=hsImportMod,hsLineComment,hsBlockComment
72syn match hsImportMod		contained "\<\(as\|qualified\|hiding\)\>"
73syn match hsInfix		"\<\(infix\|infixl\|infixr\)\>"
74syn match hsStructure		"\<\(class\|data\|deriving\|instance\|default\|where\)\>"
75syn match hsTypedef		"\<\(type\|newtype\)\>"
76syn match hsStatement		"\<\(do\|case\|of\|let\|in\)\>"
77syn match hsConditional		"\<\(if\|then\|else\)\>"
78
79" Not real keywords, but close.
80if exists("hs_highlight_boolean")
81  " Boolean constants from the standard prelude.
82  syn match hsBoolean "\<\(True\|False\)\>"
83endif
84if exists("hs_highlight_types")
85  " Primitive types from the standard prelude and libraries.
86  syn match hsType "\<\(Int\|Integer\|Char\|Bool\|Float\|Double\|IO\|Void\|Addr\|Array\|String\)\>"
87endif
88if exists("hs_highlight_more_types")
89  " Types from the standard prelude libraries.
90  syn match hsType "\<\(Maybe\|Either\|Ratio\|Complex\|Ordering\|IOError\|IOResult\|ExitCode\)\>"
91  syn match hsMaybe    "\<Nothing\>"
92  syn match hsExitCode "\<\(ExitSuccess\)\>"
93  syn match hsOrdering "\<\(GT\|LT\|EQ\)\>"
94endif
95if exists("hs_highlight_debug")
96  " Debugging functions from the standard prelude.
97  syn match hsDebug "\<\(undefined\|error\|trace\)\>"
98endif
99
100
101" Comments
102syn match   hsLineComment      "---*\([^-!#$%&\*\+./<=>\?@\\^|~].*\)\?$"
103syn region  hsBlockComment     start="{-"  end="-}" contains=hsBlockComment
104syn region  hsPragma	       start="{-#" end="#-}"
105
106" C Preprocessor directives. Shamelessly ripped from c.vim and trimmed
107" First, see whether to flag directive-like lines or not
108if (!exists("hs_allow_hash_operator"))
109    syn match	cError		display "^\s*\(%:\|#\).*$"
110endif
111" Accept %: for # (C99)
112syn region	cPreCondit	start="^\s*\(%:\|#\)\s*\(if\|ifdef\|ifndef\|elif\)\>" skip="\\$" end="$" end="//"me=s-1 contains=cComment,cCppString,cCommentError
113syn match	cPreCondit	display "^\s*\(%:\|#\)\s*\(else\|endif\)\>"
114syn region	cCppOut		start="^\s*\(%:\|#\)\s*if\s\+0\+\>" end=".\@=\|$" contains=cCppOut2
115syn region	cCppOut2	contained start="0" end="^\s*\(%:\|#\)\s*\(endif\>\|else\>\|elif\>\)" contains=cCppSkip
116syn region	cCppSkip	contained start="^\s*\(%:\|#\)\s*\(if\>\|ifdef\>\|ifndef\>\)" skip="\\$" end="^\s*\(%:\|#\)\s*endif\>" contains=cCppSkip
117syn region	cIncluded	display contained start=+"+ skip=+\\\\\|\\"+ end=+"+
118syn match	cIncluded	display contained "<[^>]*>"
119syn match	cInclude	display "^\s*\(%:\|#\)\s*include\>\s*["<]" contains=cIncluded
120syn cluster	cPreProcGroup	contains=cPreCondit,cIncluded,cInclude,cDefine,cCppOut,cCppOut2,cCppSkip,cCommentStartError
121syn region	cDefine		matchgroup=cPreCondit start="^\s*\(%:\|#\)\s*\(define\|undef\)\>" skip="\\$" end="$"
122syn region	cPreProc	matchgroup=cPreCondit start="^\s*\(%:\|#\)\s*\(pragma\>\|line\>\|warning\>\|warn\>\|error\>\)" skip="\\$" end="$" keepend
123
124syn region	cComment	matchgroup=cCommentStart start="/\*" end="\*/" contains=cCommentStartError,cSpaceError contained
125syntax match	cCommentError	display "\*/" contained
126syntax match	cCommentStartError display "/\*"me=e-1 contained
127syn region	cCppString	start=+L\="+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end='$' contains=cSpecial contained
128
129" Define the default highlighting.
130" For version 5.7 and earlier: only when not done already
131" For version 5.8 and later: only when an item doesn't have highlighting yet
132if version >= 508 || !exists("did_hs_syntax_inits")
133  if version < 508
134    let did_hs_syntax_inits = 1
135    command -nargs=+ HiLink hi link <args>
136  else
137    command -nargs=+ HiLink hi def link <args>
138  endif
139
140  HiLink hsModule			  hsStructure
141  HiLink hsImport			  Include
142  HiLink hsImportMod			  hsImport
143  HiLink hsInfix			  PreProc
144  HiLink hsStructure			  Structure
145  HiLink hsStatement			  Statement
146  HiLink hsConditional			  Conditional
147  HiLink hsSpecialChar			  SpecialChar
148  HiLink hsTypedef			  Typedef
149  HiLink hsVarSym			  hsOperator
150  HiLink hsConSym			  hsOperator
151  HiLink hsOperator			  Operator
152  if exists("hs_highlight_delimiters")
153    " Some people find this highlighting distracting.
154    HiLink hsDelimiter			  Delimiter
155  endif
156  HiLink hsSpecialCharError		  Error
157  HiLink hsString			  String
158  HiLink hsCharacter			  Character
159  HiLink hsNumber			  Number
160  HiLink hsFloat			  Float
161  HiLink hsConditional			  Conditional
162  HiLink hsLiterateComment		  hsComment
163  HiLink hsBlockComment		  hsComment
164  HiLink hsLineComment			  hsComment
165  HiLink hsComment			  Comment
166  HiLink hsPragma			  SpecialComment
167  HiLink hsBoolean			  Boolean
168  HiLink hsType			  Type
169  HiLink hsMaybe			  hsEnumConst
170  HiLink hsOrdering			  hsEnumConst
171  HiLink hsEnumConst			  Constant
172  HiLink hsDebug			  Debug
173
174  HiLink cCppString		hsString
175  HiLink cCommentStart		hsComment
176  HiLink cCommentError		hsError
177  HiLink cCommentStartError	hsError
178  HiLink cInclude		Include
179  HiLink cPreProc		PreProc
180  HiLink cDefine		Macro
181  HiLink cIncluded		hsString
182  HiLink cError			Error
183  HiLink cPreCondit		PreCondit
184  HiLink cComment		Comment
185  HiLink cCppSkip		cCppOut
186  HiLink cCppOut2		cCppOut
187  HiLink cCppOut		Comment
188
189  delcommand HiLink
190endif
191
192let b:current_syntax = "haskell"
193
194" Options for vi: ts=8 sw=2 sts=2 nowrap noexpandtab ft=vim
195