Merge branch 'vim-with-runtime' into feat/quickfix-title
[vim_extended.git] / runtime / syntax / haskell.vim
blob8afca048ccaab75d94b0aa5335297f7d90c16a80
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>
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.
33 " 2008 Dec 15: Added comments as contained element in import statements
35 " Remove any old syntax stuff hanging around
36 if version < 600
37   syn clear
38 elseif exists("b:current_syntax")
39   finish
40 endif
42 " (Qualified) identifiers (no default highlighting)
43 syn match ConId "\(\<[A-Z][a-zA-Z0-9_']*\.\)\=\<[A-Z][a-zA-Z0-9_']*\>"
44 syn match VarId "\(\<[A-Z][a-zA-Z0-9_']*\.\)\=\<[a-z][a-zA-Z0-9_']*\>"
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).
49 syn match hsVarSym "\(\<[A-Z][a-zA-Z0-9_']*\.\)\=[-!#$%&\*\+/<=>\?@\\^|~.][-!#$%&\*\+/<=>\?@\\^|~:.]*"
50 syn match hsConSym "\(\<[A-Z][a-zA-Z0-9_']*\.\)\=:[-!#$%&\*\+./<=>\?@\\^|~:]*"
51 syn match hsVarSym "`\(\<[A-Z][a-zA-Z0-9_']*\.\)\=[a-z][a-zA-Z0-9_']*`"
52 syn match hsConSym "`\(\<[A-Z][a-zA-Z0-9_']*\.\)\=[A-Z][a-zA-Z0-9_']*`"
54 " Reserved symbols--cannot be overloaded.
55 syn match hsDelimiter  "(\|)\|\[\|\]\|,\|;\|_\|{\|}"
57 " Strings and constants
58 syn match   hsSpecialChar       contained "\\\([0-9]\+\|o[0-7]\+\|x[0-9a-fA-F]\+\|[\"\\'&\\abfnrtv]\|^[A-Z^_\[\\\]]\)"
59 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\)"
60 syn match   hsSpecialCharError  contained "\\&\|'''\+"
61 syn region  hsString            start=+"+  skip=+\\\\\|\\"+  end=+"+  contains=hsSpecialChar
62 syn match   hsCharacter         "[^a-zA-Z0-9_']'\([^\\]\|\\[^']\+\|\\'\)'"lc=1 contains=hsSpecialChar,hsSpecialCharError
63 syn match   hsCharacter         "^'\([^\\]\|\\[^']\+\|\\'\)'" contains=hsSpecialChar,hsSpecialCharError
64 syn match   hsNumber            "\<[0-9]\+\>\|\<0[xX][0-9a-fA-F]\+\>\|\<0[oO][0-7]\+\>"
65 syn match   hsFloat             "\<[0-9]\+\.[0-9]\+\([eE][-+]\=[0-9]\+\)\=\>"
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).
70 syn match hsModule              "\<module\>"
71 syn match hsImport              "\<import\>.*"he=s+6 contains=hsImportMod,hsLineComment,hsBlockComment
72 syn match hsImportMod           contained "\<\(as\|qualified\|hiding\)\>"
73 syn match hsInfix               "\<\(infix\|infixl\|infixr\)\>"
74 syn match hsStructure           "\<\(class\|data\|deriving\|instance\|default\|where\)\>"
75 syn match hsTypedef             "\<\(type\|newtype\)\>"
76 syn match hsStatement           "\<\(do\|case\|of\|let\|in\)\>"
77 syn match hsConditional         "\<\(if\|then\|else\)\>"
79 " Not real keywords, but close.
80 if exists("hs_highlight_boolean")
81   " Boolean constants from the standard prelude.
82   syn match hsBoolean "\<\(True\|False\)\>"
83 endif
84 if 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\)\>"
87 endif
88 if 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\)\>"
94 endif
95 if exists("hs_highlight_debug")
96   " Debugging functions from the standard prelude.
97   syn match hsDebug "\<\(undefined\|error\|trace\)\>"
98 endif
101 " Comments
102 syn match   hsLineComment      "---*\([^-!#$%&\*\+./<=>\?@\\^|~].*\)\?$"
103 syn region  hsBlockComment     start="{-"  end="-}" contains=hsBlockComment
104 syn region  hsPragma           start="{-#" end="#-}"
106 " C Preprocessor directives. Shamelessly ripped from c.vim and trimmed
107 " First, see whether to flag directive-like lines or not
108 if (!exists("hs_allow_hash_operator"))
109     syn match   cError          display "^\s*\(%:\|#\).*$"
110 endif
111 " Accept %: for # (C99)
112 syn region      cPreCondit      start="^\s*\(%:\|#\)\s*\(if\|ifdef\|ifndef\|elif\)\>" skip="\\$" end="$" end="//"me=s-1 contains=cComment,cCppString,cCommentError
113 syn match       cPreCondit      display "^\s*\(%:\|#\)\s*\(else\|endif\)\>"
114 syn region      cCppOut         start="^\s*\(%:\|#\)\s*if\s\+0\+\>" end=".\@=\|$" contains=cCppOut2
115 syn region      cCppOut2        contained start="0" end="^\s*\(%:\|#\)\s*\(endif\>\|else\>\|elif\>\)" contains=cCppSkip
116 syn region      cCppSkip        contained start="^\s*\(%:\|#\)\s*\(if\>\|ifdef\>\|ifndef\>\)" skip="\\$" end="^\s*\(%:\|#\)\s*endif\>" contains=cCppSkip
117 syn region      cIncluded       display contained start=+"+ skip=+\\\\\|\\"+ end=+"+
118 syn match       cIncluded       display contained "<[^>]*>"
119 syn match       cInclude        display "^\s*\(%:\|#\)\s*include\>\s*["<]" contains=cIncluded
120 syn cluster     cPreProcGroup   contains=cPreCondit,cIncluded,cInclude,cDefine,cCppOut,cCppOut2,cCppSkip,cCommentStartError
121 syn region      cDefine         matchgroup=cPreCondit start="^\s*\(%:\|#\)\s*\(define\|undef\)\>" skip="\\$" end="$"
122 syn region      cPreProc        matchgroup=cPreCondit start="^\s*\(%:\|#\)\s*\(pragma\>\|line\>\|warning\>\|warn\>\|error\>\)" skip="\\$" end="$" keepend
124 syn region      cComment        matchgroup=cCommentStart start="/\*" end="\*/" contains=cCommentStartError,cSpaceError contained
125 syntax match    cCommentError   display "\*/" contained
126 syntax match    cCommentStartError display "/\*"me=e-1 contained
127 syn region      cCppString      start=+L\="+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end='$' contains=cSpecial contained
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
132 if 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
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
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
189   delcommand HiLink
190 endif
192 let b:current_syntax = "haskell"
194 " Options for vi: ts=8 sw=2 sts=2 nowrap noexpandtab ft=vim