Merged from the latest developing branch.
[MacVim.git] / runtime / syntax / haskell.vim
blob21fcf81f58919a6415348550c466276546d529fe
1 " Vim syntax file
2 " Language:             Haskell
3 " Maintainer:           Haskell Cafe mailinglist <haskell-cafe@haskell.org>
4 " Last Change:          2004 Feb 23
5 " Original Author:      John Williams <jrw@pobox.com>
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.
13 " Options-assign a value to these variables to turn the option on:
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
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.
34 " Remove any old syntax stuff hanging around
35 if version < 600
36   syn clear
37 elseif exists("b:current_syntax")
38   finish
39 endif
41 " (Qualified) identifiers (no default highlighting)
42 syn match ConId "\(\<[A-Z][a-zA-Z0-9_']*\.\)\=\<[A-Z][a-zA-Z0-9_']*\>"
43 syn match VarId "\(\<[A-Z][a-zA-Z0-9_']*\.\)\=\<[a-z][a-zA-Z0-9_']*\>"
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).
48 syn match hsVarSym "\(\<[A-Z][a-zA-Z0-9_']*\.\)\=[-!#$%&\*\+/<=>\?@\\^|~.][-!#$%&\*\+/<=>\?@\\^|~:.]*"
49 syn match hsConSym "\(\<[A-Z][a-zA-Z0-9_']*\.\)\=:[-!#$%&\*\+./<=>\?@\\^|~:]*"
50 syn match hsVarSym "`\(\<[A-Z][a-zA-Z0-9_']*\.\)\=[a-z][a-zA-Z0-9_']*`"
51 syn match hsConSym "`\(\<[A-Z][a-zA-Z0-9_']*\.\)\=[A-Z][a-zA-Z0-9_']*`"
53 " Reserved symbols--cannot be overloaded.
54 syn match hsDelimiter  "(\|)\|\[\|\]\|,\|;\|_\|{\|}"
56 " Strings and constants
57 syn match   hsSpecialChar       contained "\\\([0-9]\+\|o[0-7]\+\|x[0-9a-fA-F]\+\|[\"\\'&\\abfnrtv]\|^[A-Z^_\[\\\]]\)"
58 syn 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\)"
59 syn match   hsSpecialCharError  contained "\\&\|'''\+"
60 syn region  hsString            start=+"+  skip=+\\\\\|\\"+  end=+"+  contains=hsSpecialChar
61 syn match   hsCharacter         "[^a-zA-Z0-9_']'\([^\\]\|\\[^']\+\|\\'\)'"lc=1 contains=hsSpecialChar,hsSpecialCharError
62 syn match   hsCharacter         "^'\([^\\]\|\\[^']\+\|\\'\)'" contains=hsSpecialChar,hsSpecialCharError
63 syn match   hsNumber            "\<[0-9]\+\>\|\<0[xX][0-9a-fA-F]\+\>\|\<0[oO][0-7]\+\>"
64 syn match   hsFloat             "\<[0-9]\+\.[0-9]\+\([eE][-+]\=[0-9]\+\)\=\>"
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).
69 syn match hsModule              "\<module\>"
70 syn match hsImport              "\<import\>.*"he=s+6 contains=hsImportMod
71 syn match hsImportMod           contained "\<\(as\|qualified\|hiding\)\>"
72 syn match hsInfix               "\<\(infix\|infixl\|infixr\)\>"
73 syn match hsStructure           "\<\(class\|data\|deriving\|instance\|default\|where\)\>"
74 syn match hsTypedef             "\<\(type\|newtype\)\>"
75 syn match hsStatement           "\<\(do\|case\|of\|let\|in\)\>"
76 syn match hsConditional         "\<\(if\|then\|else\)\>"
78 " Not real keywords, but close.
79 if exists("hs_highlight_boolean")
80   " Boolean constants from the standard prelude.
81   syn match hsBoolean "\<\(True\|False\)\>"
82 endif
83 if 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\)\>"
86 endif
87 if 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\)\>"
93 endif
94 if exists("hs_highlight_debug")
95   " Debugging functions from the standard prelude.
96   syn match hsDebug "\<\(undefined\|error\|trace\)\>"
97 endif
100 " Comments
101 syn match   hsLineComment      "---*\([^-!#$%&\*\+./<=>\?@\\^|~].*\)\?$"
102 syn region  hsBlockComment     start="{-"  end="-}" contains=hsBlockComment
103 syn region  hsPragma           start="{-#" end="#-}"
105 " C Preprocessor directives. Shamelessly ripped from c.vim and trimmed
106 " First, see whether to flag directive-like lines or not
107 if (!exists("hs_allow_hash_operator"))
108     syn match   cError          display "^\s*\(%:\|#\).*$"
109 endif
110 " Accept %: for # (C99)
111 syn region      cPreCondit      start="^\s*\(%:\|#\)\s*\(if\|ifdef\|ifndef\|elif\)\>" skip="\\$" end="$" end="//"me=s-1 contains=cComment,cCppString,cCommentError
112 syn match       cPreCondit      display "^\s*\(%:\|#\)\s*\(else\|endif\)\>"
113 syn region      cCppOut         start="^\s*\(%:\|#\)\s*if\s\+0\+\>" end=".\@=\|$" contains=cCppOut2
114 syn region      cCppOut2        contained start="0" end="^\s*\(%:\|#\)\s*\(endif\>\|else\>\|elif\>\)" contains=cCppSkip
115 syn region      cCppSkip        contained start="^\s*\(%:\|#\)\s*\(if\>\|ifdef\>\|ifndef\>\)" skip="\\$" end="^\s*\(%:\|#\)\s*endif\>" contains=cCppSkip
116 syn region      cIncluded       display contained start=+"+ skip=+\\\\\|\\"+ end=+"+
117 syn match       cIncluded       display contained "<[^>]*>"
118 syn match       cInclude        display "^\s*\(%:\|#\)\s*include\>\s*["<]" contains=cIncluded
119 syn cluster     cPreProcGroup   contains=cPreCondit,cIncluded,cInclude,cDefine,cCppOut,cCppOut2,cCppSkip,cCommentStartError
120 syn region      cDefine         matchgroup=cPreCondit start="^\s*\(%:\|#\)\s*\(define\|undef\)\>" skip="\\$" end="$"
121 syn region      cPreProc        matchgroup=cPreCondit start="^\s*\(%:\|#\)\s*\(pragma\>\|line\>\|warning\>\|warn\>\|error\>\)" skip="\\$" end="$" keepend
123 syn region      cComment        matchgroup=cCommentStart start="/\*" end="\*/" contains=cCommentStartError,cSpaceError contained
124 syntax match    cCommentError   display "\*/" contained
125 syntax match    cCommentStartError display "/\*"me=e-1 contained
126 syn region      cCppString      start=+L\="+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end='$' contains=cSpecial contained
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
131 if 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
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
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
188   delcommand HiLink
189 endif
191 let b:current_syntax = "haskell"
193 " Options for vi: ts=8 sw=2 sts=2 nowrap noexpandtab ft=vim