Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1 | " Vim syntax file |
| 2 | " Language: Haskell |
| 3 | " Maintainer: Haskell Cafe mailinglist <haskell-cafe@haskell.org> |
Bram Moolenaar | 4f4d51a | 2020-10-11 13:57:40 +0200 | [diff] [blame] | 4 | " Last Change: 2020 Oct 4 by Marcin Szamotulski <profunctor@pm.me> |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 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. |
Bram Moolenaar | 5c73622 | 2010-01-06 20:54:52 +0100 | [diff] [blame] | 33 | " 2008 Dec 15: Added comments as contained element in import statements |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 34 | |
Bram Moolenaar | 89bcfda | 2016-08-30 23:26:57 +0200 | [diff] [blame] | 35 | " quit when a syntax file was already loaded |
| 36 | if exists("b:current_syntax") |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 37 | finish |
| 38 | endif |
| 39 | |
| 40 | " (Qualified) identifiers (no default highlighting) |
Bram Moolenaar | 4f4d51a | 2020-10-11 13:57:40 +0200 | [diff] [blame] | 41 | syn match ConId "\(\<[A-Z][a-zA-Z0-9_']*\.\)*\<[A-Z][a-zA-Z0-9_']*\>" contains=@NoSpell |
| 42 | syn match VarId "\(\<[A-Z][a-zA-Z0-9_']*\.\)*\<[a-z][a-zA-Z0-9_']*\>" contains=@NoSpell |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 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). |
| 47 | syn match hsVarSym "\(\<[A-Z][a-zA-Z0-9_']*\.\)\=[-!#$%&\*\+/<=>\?@\\^|~.][-!#$%&\*\+/<=>\?@\\^|~:.]*" |
| 48 | syn match hsConSym "\(\<[A-Z][a-zA-Z0-9_']*\.\)\=:[-!#$%&\*\+./<=>\?@\\^|~:]*" |
| 49 | syn match hsVarSym "`\(\<[A-Z][a-zA-Z0-9_']*\.\)\=[a-z][a-zA-Z0-9_']*`" |
| 50 | syn match hsConSym "`\(\<[A-Z][a-zA-Z0-9_']*\.\)\=[A-Z][a-zA-Z0-9_']*`" |
| 51 | |
Bram Moolenaar | 4f4d51a | 2020-10-11 13:57:40 +0200 | [diff] [blame] | 52 | " (Non-qualified) identifiers which start with # are labels |
| 53 | syn match hsLabel "#[a-z][a-zA-Z0-9_']*\>" |
| 54 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 55 | " Reserved symbols--cannot be overloaded. |
Bram Moolenaar | 4f4d51a | 2020-10-11 13:57:40 +0200 | [diff] [blame] | 56 | syn match hsDelimiter "(\|)\|\[\|\]\|,\|;\|{\|}" |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 57 | |
| 58 | " Strings and constants |
| 59 | syn match hsSpecialChar contained "\\\([0-9]\+\|o[0-7]\+\|x[0-9a-fA-F]\+\|[\"\\'&\\abfnrtv]\|^[A-Z^_\[\\\]]\)" |
| 60 | 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\)" |
| 61 | syn match hsSpecialCharError contained "\\&\|'''\+" |
Bram Moolenaar | 25a6e8a | 2018-03-30 12:27:32 +0200 | [diff] [blame] | 62 | syn region hsString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=hsSpecialChar,@NoSpell |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 63 | syn match hsCharacter "[^a-zA-Z0-9_']'\([^\\]\|\\[^']\+\|\\'\)'"lc=1 contains=hsSpecialChar,hsSpecialCharError |
| 64 | syn match hsCharacter "^'\([^\\]\|\\[^']\+\|\\'\)'" contains=hsSpecialChar,hsSpecialCharError |
Bram Moolenaar | f0b03c4 | 2017-12-17 17:17:07 +0100 | [diff] [blame] | 65 | syn 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])*>" |
| 66 | syn 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])*>" |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 67 | |
Bram Moolenaar | 4f4d51a | 2020-10-11 13:57:40 +0200 | [diff] [blame] | 68 | " Keyword definitions. |
| 69 | syn keyword hsModule module |
| 70 | syn match hsImportGroup "\<import\>.*" contains=hsImport,hsImportModuleName,hsImportMod,hsLineComment,hsBlockComment,hsImportList,@NoSpell nextgroup=hsImport |
| 71 | syn keyword hsImport import contained nextgroup=hsImportModuleName |
| 72 | syn match hsImportModuleName '\<[A-Z][A-Za-z.]*' contained |
| 73 | syn region hsImportList start='(' skip='([^)]\{-})' end=')' keepend contained contains=ConId,VarId,hsDelimiter,hsBlockComment,hsTypedef,@NoSpell |
| 74 | |
| 75 | syn keyword hsImportMod contained as qualified hiding |
| 76 | syn keyword hsInfix infix infixl infixr |
| 77 | syn keyword hsStructure class data deriving instance default where |
| 78 | syn keyword hsTypedef type |
| 79 | syn keyword hsNewtypedef newtype |
| 80 | syn keyword hsTypeFam family |
| 81 | syn keyword hsStatement mdo do case of let in |
| 82 | syn keyword hsConditional if then else |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 83 | |
| 84 | " Not real keywords, but close. |
| 85 | if exists("hs_highlight_boolean") |
| 86 | " Boolean constants from the standard prelude. |
Bram Moolenaar | 4f4d51a | 2020-10-11 13:57:40 +0200 | [diff] [blame] | 87 | syn keyword hsBoolean True False |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 88 | endif |
| 89 | if exists("hs_highlight_types") |
| 90 | " Primitive types from the standard prelude and libraries. |
Bram Moolenaar | 4f4d51a | 2020-10-11 13:57:40 +0200 | [diff] [blame] | 91 | syn keyword hsType Int Integer Char Bool Float Double IO Void Addr Array String |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 92 | endif |
| 93 | if exists("hs_highlight_more_types") |
| 94 | " Types from the standard prelude libraries. |
Bram Moolenaar | 4f4d51a | 2020-10-11 13:57:40 +0200 | [diff] [blame] | 95 | syn keyword hsType Maybe Either Ratio Complex Ordering IOError IOResult ExitCode |
| 96 | syn keyword hsMaybe Nothing |
| 97 | syn keyword hsExitCode ExitSuccess |
| 98 | syn keyword hsOrdering GT LT EQ |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 99 | endif |
| 100 | if exists("hs_highlight_debug") |
| 101 | " Debugging functions from the standard prelude. |
Bram Moolenaar | 4f4d51a | 2020-10-11 13:57:40 +0200 | [diff] [blame] | 102 | syn keyword hsDebug undefined error trace |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 103 | endif |
| 104 | |
| 105 | |
| 106 | " Comments |
Bram Moolenaar | 25a6e8a | 2018-03-30 12:27:32 +0200 | [diff] [blame] | 107 | syn match hsLineComment "---*\([^-!#$%&\*\+./<=>\?@\\^|~].*\)\?$" contains=@Spell |
| 108 | syn region hsBlockComment start="{-" end="-}" contains=hsBlockComment,@Spell |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 109 | syn region hsPragma start="{-#" end="#-}" |
| 110 | |
Bruno-366 | 817db40 | 2023-08-18 00:04:54 +0200 | [diff] [blame] | 111 | syn keyword hsTodo contained FIXME TODO XXX NOTE |
| 112 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 113 | " C Preprocessor directives. Shamelessly ripped from c.vim and trimmed |
| 114 | " First, see whether to flag directive-like lines or not |
| 115 | if (!exists("hs_allow_hash_operator")) |
| 116 | syn match cError display "^\s*\(%:\|#\).*$" |
| 117 | endif |
| 118 | " Accept %: for # (C99) |
| 119 | syn region cPreCondit start="^\s*\(%:\|#\)\s*\(if\|ifdef\|ifndef\|elif\)\>" skip="\\$" end="$" end="//"me=s-1 contains=cComment,cCppString,cCommentError |
| 120 | syn match cPreCondit display "^\s*\(%:\|#\)\s*\(else\|endif\)\>" |
| 121 | syn region cCppOut start="^\s*\(%:\|#\)\s*if\s\+0\+\>" end=".\@=\|$" contains=cCppOut2 |
| 122 | syn region cCppOut2 contained start="0" end="^\s*\(%:\|#\)\s*\(endif\>\|else\>\|elif\>\)" contains=cCppSkip |
| 123 | syn region cCppSkip contained start="^\s*\(%:\|#\)\s*\(if\>\|ifdef\>\|ifndef\>\)" skip="\\$" end="^\s*\(%:\|#\)\s*endif\>" contains=cCppSkip |
| 124 | syn region cIncluded display contained start=+"+ skip=+\\\\\|\\"+ end=+"+ |
| 125 | syn match cIncluded display contained "<[^>]*>" |
| 126 | syn match cInclude display "^\s*\(%:\|#\)\s*include\>\s*["<]" contains=cIncluded |
| 127 | syn cluster cPreProcGroup contains=cPreCondit,cIncluded,cInclude,cDefine,cCppOut,cCppOut2,cCppSkip,cCommentStartError |
| 128 | syn region cDefine matchgroup=cPreCondit start="^\s*\(%:\|#\)\s*\(define\|undef\)\>" skip="\\$" end="$" |
| 129 | syn region cPreProc matchgroup=cPreCondit start="^\s*\(%:\|#\)\s*\(pragma\>\|line\>\|warning\>\|warn\>\|error\>\)" skip="\\$" end="$" keepend |
| 130 | |
| 131 | syn region cComment matchgroup=cCommentStart start="/\*" end="\*/" contains=cCommentStartError,cSpaceError contained |
| 132 | syntax match cCommentError display "\*/" contained |
| 133 | syntax match cCommentStartError display "/\*"me=e-1 contained |
| 134 | syn region cCppString start=+L\="+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end='$' contains=cSpecial contained |
| 135 | |
| 136 | " Define the default highlighting. |
Bram Moolenaar | 89bcfda | 2016-08-30 23:26:57 +0200 | [diff] [blame] | 137 | " Only when an item doesn't have highlighting yet |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 138 | |
Bram Moolenaar | f37506f | 2016-08-31 22:22:10 +0200 | [diff] [blame] | 139 | hi def link hsModule hsStructure |
| 140 | hi def link hsImport Include |
| 141 | hi def link hsImportMod hsImport |
| 142 | hi def link hsInfix PreProc |
| 143 | hi def link hsStructure Structure |
| 144 | hi def link hsStatement Statement |
Bram Moolenaar | 4f4d51a | 2020-10-11 13:57:40 +0200 | [diff] [blame] | 145 | hi def link hsConditional Conditional |
| 146 | hi def link hsSpecialChar SpecialChar |
Bram Moolenaar | f37506f | 2016-08-31 22:22:10 +0200 | [diff] [blame] | 147 | hi def link hsTypedef Typedef |
Bram Moolenaar | 4f4d51a | 2020-10-11 13:57:40 +0200 | [diff] [blame] | 148 | hi def link hsNewtypedef Typedef |
Bram Moolenaar | f37506f | 2016-08-31 22:22:10 +0200 | [diff] [blame] | 149 | hi def link hsVarSym hsOperator |
| 150 | hi def link hsConSym hsOperator |
| 151 | hi def link hsOperator Operator |
Bram Moolenaar | 4f4d51a | 2020-10-11 13:57:40 +0200 | [diff] [blame] | 152 | hi def link hsTypeFam Structure |
Bram Moolenaar | 89bcfda | 2016-08-30 23:26:57 +0200 | [diff] [blame] | 153 | if exists("hs_highlight_delimiters") |
| 154 | " Some people find this highlighting distracting. |
Bram Moolenaar | f37506f | 2016-08-31 22:22:10 +0200 | [diff] [blame] | 155 | hi def link hsDelimiter Delimiter |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 156 | endif |
Bram Moolenaar | f37506f | 2016-08-31 22:22:10 +0200 | [diff] [blame] | 157 | hi def link hsSpecialCharError Error |
| 158 | hi def link hsString String |
| 159 | hi def link hsCharacter Character |
| 160 | hi def link hsNumber Number |
| 161 | hi def link hsFloat Float |
| 162 | hi def link hsConditional Conditional |
| 163 | hi def link hsLiterateComment hsComment |
| 164 | hi def link hsBlockComment hsComment |
| 165 | hi def link hsLineComment hsComment |
| 166 | hi def link hsComment Comment |
| 167 | hi def link hsPragma SpecialComment |
| 168 | hi def link hsBoolean Boolean |
| 169 | hi def link hsType Type |
| 170 | hi def link hsMaybe hsEnumConst |
| 171 | hi def link hsOrdering hsEnumConst |
| 172 | hi def link hsEnumConst Constant |
| 173 | hi def link hsDebug Debug |
Bram Moolenaar | 4f4d51a | 2020-10-11 13:57:40 +0200 | [diff] [blame] | 174 | hi def link hsLabel Special |
Bram Moolenaar | 89bcfda | 2016-08-30 23:26:57 +0200 | [diff] [blame] | 175 | |
Bram Moolenaar | 4f4d51a | 2020-10-11 13:57:40 +0200 | [diff] [blame] | 176 | hi def link cCppString hsString |
| 177 | hi def link cCommentStart hsComment |
| 178 | hi def link cCommentError hsError |
| 179 | hi def link cCommentStartError hsError |
| 180 | hi def link cInclude Include |
| 181 | hi def link cPreProc PreProc |
| 182 | hi def link cDefine Macro |
| 183 | hi def link cIncluded hsString |
| 184 | hi def link cError Error |
| 185 | hi def link cPreCondit PreCondit |
| 186 | hi def link cComment Comment |
| 187 | hi def link cCppSkip cCppOut |
| 188 | hi def link cCppOut2 cCppOut |
| 189 | hi def link cCppOut Comment |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 190 | |
| 191 | let b:current_syntax = "haskell" |
| 192 | |
| 193 | " Options for vi: ts=8 sw=2 sts=2 nowrap noexpandtab ft=vim |