xref: /vim-8.2.3635/runtime/syntax/haskell.vim (revision 4f4d51a9)
1071d4279SBram Moolenaar" Vim syntax file
2071d4279SBram Moolenaar" Language:		Haskell
3071d4279SBram Moolenaar" Maintainer:		Haskell Cafe mailinglist <[email protected]>
4*4f4d51a9SBram Moolenaar" Last Change:		2020 Oct 4 by Marcin Szamotulski <[email protected]>
5071d4279SBram Moolenaar" Original Author:	John Williams <[email protected]>
6071d4279SBram Moolenaar"
7071d4279SBram Moolenaar" Thanks to Ryan Crumley for suggestions and John Meacham for
8071d4279SBram Moolenaar" pointing out bugs. Also thanks to Ian Lynagh and Donald Bruce Stewart
9071d4279SBram Moolenaar" for providing the inspiration for the inclusion of the handling
10071d4279SBram Moolenaar" of C preprocessor directives, and for pointing out a bug in the
11071d4279SBram Moolenaar" end-of-line comment handling.
12071d4279SBram Moolenaar"
13071d4279SBram Moolenaar" Options-assign a value to these variables to turn the option on:
14071d4279SBram Moolenaar"
15071d4279SBram Moolenaar" hs_highlight_delimiters - Highlight delimiter characters--users
16071d4279SBram Moolenaar"			    with a light-colored background will
17071d4279SBram Moolenaar"			    probably want to turn this on.
18071d4279SBram Moolenaar" hs_highlight_boolean - Treat True and False as keywords.
19071d4279SBram Moolenaar" hs_highlight_types - Treat names of primitive types as keywords.
20071d4279SBram Moolenaar" hs_highlight_more_types - Treat names of other common types as keywords.
21071d4279SBram Moolenaar" hs_highlight_debug - Highlight names of debugging functions.
22071d4279SBram Moolenaar" hs_allow_hash_operator - Don't highlight seemingly incorrect C
23071d4279SBram Moolenaar"			   preprocessor directives but assume them to be
24071d4279SBram Moolenaar"			   operators
25071d4279SBram Moolenaar"
26071d4279SBram Moolenaar" 2004 Feb 19: Added C preprocessor directive handling, corrected eol comments
27071d4279SBram Moolenaar"	       cleaned away literate haskell support (should be entirely in
28071d4279SBram Moolenaar"	       lhaskell.vim)
29071d4279SBram Moolenaar" 2004 Feb 20: Cleaned up C preprocessor directive handling, fixed single \
30071d4279SBram Moolenaar"	       in eol comment character class
31071d4279SBram Moolenaar" 2004 Feb 23: Made the leading comments somewhat clearer where it comes
32071d4279SBram Moolenaar"	       to attribution of work.
335c73622aSBram Moolenaar" 2008 Dec 15: Added comments as contained element in import statements
34071d4279SBram Moolenaar
3589bcfda6SBram Moolenaar" quit when a syntax file was already loaded
3689bcfda6SBram Moolenaarif exists("b:current_syntax")
37071d4279SBram Moolenaar  finish
38071d4279SBram Moolenaarendif
39071d4279SBram Moolenaar
40071d4279SBram Moolenaar" (Qualified) identifiers (no default highlighting)
41*4f4d51a9SBram Moolenaarsyn match ConId "\(\<[A-Z][a-zA-Z0-9_']*\.\)*\<[A-Z][a-zA-Z0-9_']*\>" contains=@NoSpell
42*4f4d51a9SBram Moolenaarsyn match VarId "\(\<[A-Z][a-zA-Z0-9_']*\.\)*\<[a-z][a-zA-Z0-9_']*\>" contains=@NoSpell
43071d4279SBram Moolenaar
44071d4279SBram Moolenaar" Infix operators--most punctuation characters and any (qualified) identifier
45071d4279SBram Moolenaar" enclosed in `backquotes`. An operator starting with : is a constructor,
46071d4279SBram Moolenaar" others are variables (e.g. functions).
47071d4279SBram Moolenaarsyn match hsVarSym "\(\<[A-Z][a-zA-Z0-9_']*\.\)\=[-!#$%&\*\+/<=>\?@\\^|~.][-!#$%&\*\+/<=>\?@\\^|~:.]*"
48071d4279SBram Moolenaarsyn match hsConSym "\(\<[A-Z][a-zA-Z0-9_']*\.\)\=:[-!#$%&\*\+./<=>\?@\\^|~:]*"
49071d4279SBram Moolenaarsyn match hsVarSym "`\(\<[A-Z][a-zA-Z0-9_']*\.\)\=[a-z][a-zA-Z0-9_']*`"
50071d4279SBram Moolenaarsyn match hsConSym "`\(\<[A-Z][a-zA-Z0-9_']*\.\)\=[A-Z][a-zA-Z0-9_']*`"
51071d4279SBram Moolenaar
52*4f4d51a9SBram Moolenaar" (Non-qualified) identifiers which start with # are labels
53*4f4d51a9SBram Moolenaarsyn match hsLabel "#[a-z][a-zA-Z0-9_']*\>"
54*4f4d51a9SBram Moolenaar
55071d4279SBram Moolenaar" Reserved symbols--cannot be overloaded.
56*4f4d51a9SBram Moolenaarsyn match hsDelimiter  "(\|)\|\[\|\]\|,\|;\|{\|}"
57071d4279SBram Moolenaar
58071d4279SBram Moolenaar" Strings and constants
59071d4279SBram Moolenaarsyn match   hsSpecialChar	contained "\\\([0-9]\+\|o[0-7]\+\|x[0-9a-fA-F]\+\|[\"\\'&\\abfnrtv]\|^[A-Z^_\[\\\]]\)"
60071d4279SBram Moolenaarsyn 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\)"
61071d4279SBram Moolenaarsyn match   hsSpecialCharError	contained "\\&\|'''\+"
6225a6e8a7SBram Moolenaarsyn region  hsString		start=+"+  skip=+\\\\\|\\"+  end=+"+  contains=hsSpecialChar,@NoSpell
63071d4279SBram Moolenaarsyn match   hsCharacter		"[^a-zA-Z0-9_']'\([^\\]\|\\[^']\+\|\\'\)'"lc=1 contains=hsSpecialChar,hsSpecialCharError
64071d4279SBram Moolenaarsyn match   hsCharacter		"^'\([^\\]\|\\[^']\+\|\\'\)'" contains=hsSpecialChar,hsSpecialCharError
65f0b03c4eSBram Moolenaarsyn 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])*>"
66f0b03c4eSBram Moolenaarsyn 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])*>"
67071d4279SBram Moolenaar
68*4f4d51a9SBram Moolenaar" Keyword definitions.
69*4f4d51a9SBram Moolenaarsyn keyword hsModule		module
70*4f4d51a9SBram Moolenaarsyn match   hsImportGroup	"\<import\>.*" contains=hsImport,hsImportModuleName,hsImportMod,hsLineComment,hsBlockComment,hsImportList,@NoSpell nextgroup=hsImport
71*4f4d51a9SBram Moolenaarsyn keyword hsImport import contained nextgroup=hsImportModuleName
72*4f4d51a9SBram Moolenaarsyn match   hsImportModuleName '\<[A-Z][A-Za-z.]*' contained
73*4f4d51a9SBram Moolenaarsyn region  hsImportList start='(' skip='([^)]\{-})' end=')' keepend contained contains=ConId,VarId,hsDelimiter,hsBlockComment,hsTypedef,@NoSpell
74*4f4d51a9SBram Moolenaar
75*4f4d51a9SBram Moolenaarsyn keyword hsImportMod contained as qualified hiding
76*4f4d51a9SBram Moolenaarsyn keyword hsInfix infix infixl infixr
77*4f4d51a9SBram Moolenaarsyn keyword hsStructure class data deriving instance default where
78*4f4d51a9SBram Moolenaarsyn keyword hsTypedef type
79*4f4d51a9SBram Moolenaarsyn keyword hsNewtypedef newtype
80*4f4d51a9SBram Moolenaarsyn keyword hsTypeFam family
81*4f4d51a9SBram Moolenaarsyn keyword hsStatement mdo do case of let in
82*4f4d51a9SBram Moolenaarsyn keyword hsConditional if then else
83071d4279SBram Moolenaar
84071d4279SBram Moolenaar" Not real keywords, but close.
85071d4279SBram Moolenaarif exists("hs_highlight_boolean")
86071d4279SBram Moolenaar  " Boolean constants from the standard prelude.
87*4f4d51a9SBram Moolenaar  syn keyword hsBoolean True False
88071d4279SBram Moolenaarendif
89071d4279SBram Moolenaarif exists("hs_highlight_types")
90071d4279SBram Moolenaar  " Primitive types from the standard prelude and libraries.
91*4f4d51a9SBram Moolenaar  syn keyword hsType Int Integer Char Bool Float Double IO Void Addr Array String
92071d4279SBram Moolenaarendif
93071d4279SBram Moolenaarif exists("hs_highlight_more_types")
94071d4279SBram Moolenaar  " Types from the standard prelude libraries.
95*4f4d51a9SBram Moolenaar  syn keyword hsType Maybe Either Ratio Complex Ordering IOError IOResult ExitCode
96*4f4d51a9SBram Moolenaar  syn keyword hsMaybe Nothing
97*4f4d51a9SBram Moolenaar  syn keyword hsExitCode ExitSuccess
98*4f4d51a9SBram Moolenaar  syn keyword hsOrdering GT LT EQ
99071d4279SBram Moolenaarendif
100071d4279SBram Moolenaarif exists("hs_highlight_debug")
101071d4279SBram Moolenaar  " Debugging functions from the standard prelude.
102*4f4d51a9SBram Moolenaar  syn keyword hsDebug undefined error trace
103071d4279SBram Moolenaarendif
104071d4279SBram Moolenaar
105071d4279SBram Moolenaar
106071d4279SBram Moolenaar" Comments
10725a6e8a7SBram Moolenaarsyn match   hsLineComment      "---*\([^-!#$%&\*\+./<=>\?@\\^|~].*\)\?$" contains=@Spell
10825a6e8a7SBram Moolenaarsyn region  hsBlockComment     start="{-"  end="-}" contains=hsBlockComment,@Spell
109071d4279SBram Moolenaarsyn region  hsPragma	       start="{-#" end="#-}"
110071d4279SBram Moolenaar
111071d4279SBram Moolenaar" C Preprocessor directives. Shamelessly ripped from c.vim and trimmed
112071d4279SBram Moolenaar" First, see whether to flag directive-like lines or not
113071d4279SBram Moolenaarif (!exists("hs_allow_hash_operator"))
114071d4279SBram Moolenaar    syn match	cError		display "^\s*\(%:\|#\).*$"
115071d4279SBram Moolenaarendif
116071d4279SBram Moolenaar" Accept %: for # (C99)
117071d4279SBram Moolenaarsyn region	cPreCondit	start="^\s*\(%:\|#\)\s*\(if\|ifdef\|ifndef\|elif\)\>" skip="\\$" end="$" end="//"me=s-1 contains=cComment,cCppString,cCommentError
118071d4279SBram Moolenaarsyn match	cPreCondit	display "^\s*\(%:\|#\)\s*\(else\|endif\)\>"
119071d4279SBram Moolenaarsyn region	cCppOut		start="^\s*\(%:\|#\)\s*if\s\+0\+\>" end=".\@=\|$" contains=cCppOut2
120071d4279SBram Moolenaarsyn region	cCppOut2	contained start="0" end="^\s*\(%:\|#\)\s*\(endif\>\|else\>\|elif\>\)" contains=cCppSkip
121071d4279SBram Moolenaarsyn region	cCppSkip	contained start="^\s*\(%:\|#\)\s*\(if\>\|ifdef\>\|ifndef\>\)" skip="\\$" end="^\s*\(%:\|#\)\s*endif\>" contains=cCppSkip
122071d4279SBram Moolenaarsyn region	cIncluded	display contained start=+"+ skip=+\\\\\|\\"+ end=+"+
123071d4279SBram Moolenaarsyn match	cIncluded	display contained "<[^>]*>"
124071d4279SBram Moolenaarsyn match	cInclude	display "^\s*\(%:\|#\)\s*include\>\s*["<]" contains=cIncluded
125071d4279SBram Moolenaarsyn cluster	cPreProcGroup	contains=cPreCondit,cIncluded,cInclude,cDefine,cCppOut,cCppOut2,cCppSkip,cCommentStartError
126071d4279SBram Moolenaarsyn region	cDefine		matchgroup=cPreCondit start="^\s*\(%:\|#\)\s*\(define\|undef\)\>" skip="\\$" end="$"
127071d4279SBram Moolenaarsyn region	cPreProc	matchgroup=cPreCondit start="^\s*\(%:\|#\)\s*\(pragma\>\|line\>\|warning\>\|warn\>\|error\>\)" skip="\\$" end="$" keepend
128071d4279SBram Moolenaar
129071d4279SBram Moolenaarsyn region	cComment	matchgroup=cCommentStart start="/\*" end="\*/" contains=cCommentStartError,cSpaceError contained
130071d4279SBram Moolenaarsyntax match	cCommentError	display "\*/" contained
131071d4279SBram Moolenaarsyntax match	cCommentStartError display "/\*"me=e-1 contained
132071d4279SBram Moolenaarsyn region	cCppString	start=+L\="+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end='$' contains=cSpecial contained
133071d4279SBram Moolenaar
134071d4279SBram Moolenaar" Define the default highlighting.
13589bcfda6SBram Moolenaar" Only when an item doesn't have highlighting yet
136071d4279SBram Moolenaar
137f37506f6SBram Moolenaarhi def link hsModule			  hsStructure
138f37506f6SBram Moolenaarhi def link hsImport			  Include
139f37506f6SBram Moolenaarhi def link hsImportMod			  hsImport
140f37506f6SBram Moolenaarhi def link hsInfix			  PreProc
141f37506f6SBram Moolenaarhi def link hsStructure			  Structure
142f37506f6SBram Moolenaarhi def link hsStatement			  Statement
143f37506f6SBram Moolenaarhi def link hsConditional		  Conditional
144f37506f6SBram Moolenaarhi def link hsSpecialChar		  SpecialChar
145f37506f6SBram Moolenaarhi def link hsTypedef			  Typedef
146*4f4d51a9SBram Moolenaarhi def link hsNewtypedef		  Typedef
147f37506f6SBram Moolenaarhi def link hsVarSym			  hsOperator
148f37506f6SBram Moolenaarhi def link hsConSym			  hsOperator
149f37506f6SBram Moolenaarhi def link hsOperator			  Operator
150*4f4d51a9SBram Moolenaarhi def link hsTypeFam			  Structure
151071d4279SBram Moolenaarif exists("hs_highlight_delimiters")
152071d4279SBram Moolenaar" Some people find this highlighting distracting.
153f37506f6SBram Moolenaarhi def link hsDelimiter			  Delimiter
154071d4279SBram Moolenaarendif
155f37506f6SBram Moolenaarhi def link hsSpecialCharError		  Error
156f37506f6SBram Moolenaarhi def link hsString			  String
157f37506f6SBram Moolenaarhi def link hsCharacter			  Character
158f37506f6SBram Moolenaarhi def link hsNumber			  Number
159f37506f6SBram Moolenaarhi def link hsFloat			  Float
160f37506f6SBram Moolenaarhi def link hsConditional			  Conditional
161f37506f6SBram Moolenaarhi def link hsLiterateComment		  hsComment
162f37506f6SBram Moolenaarhi def link hsBlockComment		  hsComment
163f37506f6SBram Moolenaarhi def link hsLineComment			  hsComment
164f37506f6SBram Moolenaarhi def link hsComment			  Comment
165f37506f6SBram Moolenaarhi def link hsPragma			  SpecialComment
166f37506f6SBram Moolenaarhi def link hsBoolean			  Boolean
167f37506f6SBram Moolenaarhi def link hsType			  Type
168f37506f6SBram Moolenaarhi def link hsMaybe			  hsEnumConst
169f37506f6SBram Moolenaarhi def link hsOrdering			  hsEnumConst
170f37506f6SBram Moolenaarhi def link hsEnumConst			  Constant
171f37506f6SBram Moolenaarhi def link hsDebug			  Debug
172*4f4d51a9SBram Moolenaarhi def link hsLabel			  Special
173071d4279SBram Moolenaar
174f37506f6SBram Moolenaarhi def link cCppString			  hsString
175f37506f6SBram Moolenaarhi def link cCommentStart		  hsComment
176f37506f6SBram Moolenaarhi def link cCommentError		  hsError
177f37506f6SBram Moolenaarhi def link cCommentStartError		  hsError
178f37506f6SBram Moolenaarhi def link cInclude			  Include
179f37506f6SBram Moolenaarhi def link cPreProc			  PreProc
180f37506f6SBram Moolenaarhi def link cDefine			  Macro
181f37506f6SBram Moolenaarhi def link cIncluded			  hsString
182f37506f6SBram Moolenaarhi def link cError			  Error
183f37506f6SBram Moolenaarhi def link cPreCondit			  PreCondit
184f37506f6SBram Moolenaarhi def link cComment			  Comment
185f37506f6SBram Moolenaarhi def link cCppSkip			  cCppOut
186f37506f6SBram Moolenaarhi def link cCppOut2			  cCppOut
187f37506f6SBram Moolenaarhi def link cCppOut			  Comment
188071d4279SBram Moolenaar
189071d4279SBram Moolenaarlet b:current_syntax = "haskell"
190071d4279SBram Moolenaar
191071d4279SBram Moolenaar" Options for vi: ts=8 sw=2 sts=2 nowrap noexpandtab ft=vim
192