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