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