xref: /vim-8.2.3635/runtime/syntax/haskell.vim (revision 5b8d8fdb)
1" Vim syntax file
2" Language:		Haskell
3" Maintainer:		Haskell Cafe mailinglist <[email protected]>
4" Last Change:		2004 Feb 23
5" Original Author:	John Williams <[email protected]>
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
34" Remove any old syntax stuff hanging around
35if version < 600
36  syn clear
37elseif exists("b:current_syntax")
38  finish
39endif
40
41" (Qualified) identifiers (no default highlighting)
42syn match ConId "\(\<[A-Z][a-zA-Z0-9_']*\.\)\=\<[A-Z][a-zA-Z0-9_']*\>"
43syn match VarId "\(\<[A-Z][a-zA-Z0-9_']*\.\)\=\<[a-z][a-zA-Z0-9_']*\>"
44
45" Infix operators--most punctuation characters and any (qualified) identifier
46" enclosed in `backquotes`. An operator starting with : is a constructor,
47" others are variables (e.g. functions).
48syn match hsVarSym "\(\<[A-Z][a-zA-Z0-9_']*\.\)\=[-!#$%&\*\+/<=>\?@\\^|~.][-!#$%&\*\+/<=>\?@\\^|~:.]*"
49syn match hsConSym "\(\<[A-Z][a-zA-Z0-9_']*\.\)\=:[-!#$%&\*\+./<=>\?@\\^|~:]*"
50syn match hsVarSym "`\(\<[A-Z][a-zA-Z0-9_']*\.\)\=[a-z][a-zA-Z0-9_']*`"
51syn match hsConSym "`\(\<[A-Z][a-zA-Z0-9_']*\.\)\=[A-Z][a-zA-Z0-9_']*`"
52
53" Reserved symbols--cannot be overloaded.
54syn match hsDelimiter  "(\|)\|\[\|\]\|,\|;\|_\|{\|}"
55
56" Strings and constants
57syn match   hsSpecialChar	contained "\\\([0-9]\+\|o[0-7]\+\|x[0-9a-fA-F]\+\|[\"\\'&\\abfnrtv]\|^[A-Z^_\[\\\]]\)"
58syn 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\)"
59syn match   hsSpecialCharError	contained "\\&\|'''\+"
60syn region  hsString		start=+"+  skip=+\\\\\|\\"+  end=+"+  contains=hsSpecialChar
61syn match   hsCharacter		"[^a-zA-Z0-9_']'\([^\\]\|\\[^']\+\|\\'\)'"lc=1 contains=hsSpecialChar,hsSpecialCharError
62syn match   hsCharacter		"^'\([^\\]\|\\[^']\+\|\\'\)'" contains=hsSpecialChar,hsSpecialCharError
63syn match   hsNumber		"\<[0-9]\+\>\|\<0[xX][0-9a-fA-F]\+\>\|\<0[oO][0-7]\+\>"
64syn match   hsFloat		"\<[0-9]\+\.[0-9]\+\([eE][-+]\=[0-9]\+\)\=\>"
65
66" Keyword definitions. These must be patters instead of keywords
67" because otherwise they would match as keywords at the start of a
68" "literate" comment (see lhs.vim).
69syn match hsModule		"\<module\>"
70syn match hsImport		"\<import\>.*"he=s+6 contains=hsImportMod
71syn match hsImportMod		contained "\<\(as\|qualified\|hiding\)\>"
72syn match hsInfix		"\<\(infix\|infixl\|infixr\)\>"
73syn match hsStructure		"\<\(class\|data\|deriving\|instance\|default\|where\)\>"
74syn match hsTypedef		"\<\(type\|newtype\)\>"
75syn match hsStatement		"\<\(do\|case\|of\|let\|in\)\>"
76syn match hsConditional		"\<\(if\|then\|else\)\>"
77
78" Not real keywords, but close.
79if exists("hs_highlight_boolean")
80  " Boolean constants from the standard prelude.
81  syn match hsBoolean "\<\(True\|False\)\>"
82endif
83if exists("hs_highlight_types")
84  " Primitive types from the standard prelude and libraries.
85  syn match hsType "\<\(Int\|Integer\|Char\|Bool\|Float\|Double\|IO\|Void\|Addr\|Array\|String\)\>"
86endif
87if exists("hs_highlight_more_types")
88  " Types from the standard prelude libraries.
89  syn match hsType "\<\(Maybe\|Either\|Ratio\|Complex\|Ordering\|IOError\|IOResult\|ExitCode\)\>"
90  syn match hsMaybe    "\<Nothing\>"
91  syn match hsExitCode "\<\(ExitSuccess\)\>"
92  syn match hsOrdering "\<\(GT\|LT\|EQ\)\>"
93endif
94if exists("hs_highlight_debug")
95  " Debugging functions from the standard prelude.
96  syn match hsDebug "\<\(undefined\|error\|trace\)\>"
97endif
98
99
100" Comments
101syn match   hsLineComment      "---*\([^-!#$%&\*\+./<=>\?@\\^|~].*\)\?$"
102syn region  hsBlockComment     start="{-"  end="-}" contains=hsBlockComment
103syn region  hsPragma	       start="{-#" end="#-}"
104
105" C Preprocessor directives. Shamelessly ripped from c.vim and trimmed
106" First, see whether to flag directive-like lines or not
107if (!exists("hs_allow_hash_operator"))
108    syn match	cError		display "^\s*\(%:\|#\).*$"
109endif
110" Accept %: for # (C99)
111syn region	cPreCondit	start="^\s*\(%:\|#\)\s*\(if\|ifdef\|ifndef\|elif\)\>" skip="\\$" end="$" end="//"me=s-1 contains=cComment,cCppString,cCommentError
112syn match	cPreCondit	display "^\s*\(%:\|#\)\s*\(else\|endif\)\>"
113syn region	cCppOut		start="^\s*\(%:\|#\)\s*if\s\+0\+\>" end=".\@=\|$" contains=cCppOut2
114syn region	cCppOut2	contained start="0" end="^\s*\(%:\|#\)\s*\(endif\>\|else\>\|elif\>\)" contains=cCppSkip
115syn region	cCppSkip	contained start="^\s*\(%:\|#\)\s*\(if\>\|ifdef\>\|ifndef\>\)" skip="\\$" end="^\s*\(%:\|#\)\s*endif\>" contains=cCppSkip
116syn region	cIncluded	display contained start=+"+ skip=+\\\\\|\\"+ end=+"+
117syn match	cIncluded	display contained "<[^>]*>"
118syn match	cInclude	display "^\s*\(%:\|#\)\s*include\>\s*["<]" contains=cIncluded
119syn cluster	cPreProcGroup	contains=cPreCondit,cIncluded,cInclude,cDefine,cCppOut,cCppOut2,cCppSkip,cCommentStartError
120syn region	cDefine		matchgroup=cPreCondit start="^\s*\(%:\|#\)\s*\(define\|undef\)\>" skip="\\$" end="$"
121syn region	cPreProc	matchgroup=cPreCondit start="^\s*\(%:\|#\)\s*\(pragma\>\|line\>\|warning\>\|warn\>\|error\>\)" skip="\\$" end="$" keepend
122
123syn region	cComment	matchgroup=cCommentStart start="/\*" end="\*/" contains=cCommentStartError,cSpaceError contained
124syntax match	cCommentError	display "\*/" contained
125syntax match	cCommentStartError display "/\*"me=e-1 contained
126syn region	cCppString	start=+L\="+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end='$' contains=cSpecial contained
127
128" Define the default highlighting.
129" For version 5.7 and earlier: only when not done already
130" For version 5.8 and later: only when an item doesn't have highlighting yet
131if version >= 508 || !exists("did_hs_syntax_inits")
132  if version < 508
133    let did_hs_syntax_inits = 1
134    command -nargs=+ HiLink hi link <args>
135  else
136    command -nargs=+ HiLink hi def link <args>
137  endif
138
139  HiLink hsModule			  hsStructure
140  HiLink hsImport			  Include
141  HiLink hsImportMod			  hsImport
142  HiLink hsInfix			  PreProc
143  HiLink hsStructure			  Structure
144  HiLink hsStatement			  Statement
145  HiLink hsConditional			  Conditional
146  HiLink hsSpecialChar			  SpecialChar
147  HiLink hsTypedef			  Typedef
148  HiLink hsVarSym			  hsOperator
149  HiLink hsConSym			  hsOperator
150  HiLink hsOperator			  Operator
151  if exists("hs_highlight_delimiters")
152    " Some people find this highlighting distracting.
153    HiLink hsDelimiter			  Delimiter
154  endif
155  HiLink hsSpecialCharError		  Error
156  HiLink hsString			  String
157  HiLink hsCharacter			  Character
158  HiLink hsNumber			  Number
159  HiLink hsFloat			  Float
160  HiLink hsConditional			  Conditional
161  HiLink hsLiterateComment		  hsComment
162  HiLink hsBlockComment		  hsComment
163  HiLink hsLineComment			  hsComment
164  HiLink hsComment			  Comment
165  HiLink hsPragma			  SpecialComment
166  HiLink hsBoolean			  Boolean
167  HiLink hsType			  Type
168  HiLink hsMaybe			  hsEnumConst
169  HiLink hsOrdering			  hsEnumConst
170  HiLink hsEnumConst			  Constant
171  HiLink hsDebug			  Debug
172
173  HiLink cCppString		hsString
174  HiLink cCommentStart		hsComment
175  HiLink cCommentError		hsError
176  HiLink cCommentStartError	hsError
177  HiLink cInclude		Include
178  HiLink cPreProc		PreProc
179  HiLink cDefine		Macro
180  HiLink cIncluded		hsString
181  HiLink cError			Error
182  HiLink cPreCondit		PreCondit
183  HiLink cComment		Comment
184  HiLink cCppSkip		cCppOut
185  HiLink cCppOut2		cCppOut
186  HiLink cCppOut		Comment
187
188  delcommand HiLink
189endif
190
191let b:current_syntax = "haskell"
192
193" Options for vi: ts=8 sw=2 sts=2 nowrap noexpandtab ft=vim
194