comparison runtime/syntax/haskell.vim @ 0:76efa0be13f1

Initial revision
author atsuki
date Sat, 10 Nov 2007 15:07:22 +0900
parents
children c16898406ff2
comparison
equal deleted inserted replaced
-1:000000000000 0:76efa0be13f1
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>
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
35 if version < 600
36 syn clear
37 elseif exists("b:current_syntax")
38 finish
39 endif
40
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_']*\>"
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).
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_']*`"
52
53 " Reserved symbols--cannot be overloaded.
54 syn match hsDelimiter "(\|)\|\[\|\]\|,\|;\|_\|{\|}"
55
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]\+\)\=\>"
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).
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\)\>"
77
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
98
99
100 " Comments
101 syn match hsLineComment "---*\([^-!#$%&\*\+./<=>\?@\\^|~].*\)\?$"
102 syn region hsBlockComment start="{-" end="-}" contains=hsBlockComment
103 syn 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
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
122
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
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
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
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
189 endif
190
191 let b:current_syntax = "haskell"
192
193 " Options for vi: ts=8 sw=2 sts=2 nowrap noexpandtab ft=vim