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