Permalink
Browse files

add haskell syntax file.

  • Loading branch information...
1 parent 4c408e3 commit d243283a5dd5950a72c623b339e78599924a3602 @sanemat committed Feb 19, 2012
Showing with 360 additions and 0 deletions.
  1. +360 −0 .vim/syntax/haskell.vim
@@ -0,0 +1,360 @@
+" Vim syntax file
+"
+" Modification of vims Haskell syntax file:
+" - match types using regular expression
+" - highlight toplevel functions
+" - use "syntax keyword" instead of "syntax match" where appropriate
+" - functions and types in import and module declarations are matched
+" - removed hs_highlight_more_types (just not needed anymore)
+" - enable spell checking in comments and strings only
+" - FFI highlighting
+" - QuasiQuotation
+" - top level Template Haskell slices
+" - PackageImport
+"
+" TODO: find out which vim versions are still supported
+"
+" From Original file:
+" ===================
+"
+" Language: Haskell
+" Maintainer: Haskell Cafe mailinglist <haskell-cafe@haskell.org>
+" Last Change: 2010 Feb 21
+" Original Author: John Williams <jrw@pobox.com>
+"
+" Thanks to Ryan Crumley for suggestions and John Meacham for
+" pointing out bugs. Also thanks to Ian Lynagh and Donald Bruce Stewart
+" for providing the inspiration for the inclusion of the handling
+" of C preprocessor directives, and for pointing out a bug in the
+" end-of-line comment handling.
+"
+" Options-assign a value to these variables to turn the option on:
+"
+" hs_highlight_delimiters - Highlight delimiter characters--users
+" with a light-colored background will
+" probably want to turn this on.
+" hs_highlight_boolean - Treat True and False as keywords.
+" hs_highlight_types - Treat names of primitive types as keywords.
+" hs_highlight_debug - Highlight names of debugging functions.
+" hs_allow_hash_operator - Don't highlight seemingly incorrect C
+" preprocessor directives but assume them to be
+" operators
+"
+"
+
+if version < 600
+ syn clear
+elseif exists("b:current_syntax")
+ finish
+endif
+
+"syntax sync fromstart "mmhhhh.... is this really ok to do so?
+syntax sync linebreaks=15 minlines=50 maxlines=500
+
+syn match hsSpecialChar contained "\\\([0-9]\+\|o[0-7]\+\|x[0-9a-fA-F]\+\|[\"\\'&\\abfnrtv]\|^[A-Z^_\[\\\]]\)"
+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\)"
+syn match hsSpecialCharError contained "\\&\|'''\+"
+sy region hsString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=hsSpecialChar,@Spell
+sy match hsCharacter "[^a-zA-Z0-9_']'\([^\\]\|\\[^']\+\|\\'\)'"lc=1 contains=hsSpecialChar,hsSpecialCharError
+sy match hsCharacter "^'\([^\\]\|\\[^']\+\|\\'\)'" contains=hsSpecialChar,hsSpecialCharError
+
+" (Qualified) identifiers (no default highlighting)
+syn match ConId "\(\<[A-Z][a-zA-Z0-9_']*\.\)\=\<[A-Z][a-zA-Z0-9_']*\>"
+syn match VarId "\(\<[A-Z][a-zA-Z0-9_']*\.\)\=\<[a-z][a-zA-Z0-9_']*\>"
+
+" Infix operators--most punctuation characters and any (qualified) identifier
+" enclosed in `backquotes`. An operator starting with : is a constructor,
+" others are variables (e.g. functions).
+syn match hsVarSym "\(\<[A-Z][a-zA-Z0-9_']*\.\)\=[-!#$%&\*\+/<=>\?@\\^|~.][-!#$%&\*\+/<=>\?@\\^|~:.]*"
+syn match hsConSym "\(\<[A-Z][a-zA-Z0-9_']*\.\)\=:[-!#$%&\*\+./<=>\?@\\^|~:]*"
+syn match hsVarSym "`\(\<[A-Z][a-zA-Z0-9_']*\.\)\=[a-z][a-zA-Z0-9_']*`"
+syn match hsConSym "`\(\<[A-Z][a-zA-Z0-9_']*\.\)\=[A-Z][a-zA-Z0-9_']*`"
+
+" Toplevel Template Haskell support
+"sy match hsTHTopLevel "^[a-z]\(\(.\&[^=]\)\|\(\n[^a-zA-Z0-9]\)\)*"
+sy match hsTHIDTopLevel "^[a-z]\S*"
+sy match hsTHTopLevel "^\$(\?" nextgroup=hsTHTopLevelName
+sy match hsTHTopLevelName "[a-z]\S*" contained
+
+" Reserved symbols--cannot be overloaded.
+syn match hsDelimiter "(\|)\|\[\|\]\|,\|;\|_\|{\|}"
+
+sy region hsInnerParen start="(" end=")" contained contains=hsInnerParen,hsConSym,hsType,hsVarSym
+sy region hs_InfixOpFunctionName start="^(" end=")\s*[^:`]\(\W\&\S\&[^'\"`()[\]{}@]\)\+"re=s
+ \ contained keepend contains=hsInnerParen,hs_HlInfixOp
+
+sy match hs_hlFunctionName "[a-z_]\(\S\&[^,\(\)\[\]]\)*" contained
+sy match hs_FunctionName "^[a-z_]\(\S\&[^,\(\)\[\]]\)*" contained contains=hs_hlFunctionName
+sy match hs_HighliteInfixFunctionName "`[a-z_][^`]*`" contained
+sy match hs_InfixFunctionName "^\S[^=]*`[a-z_][^`]*`"me=e-1 contained contains=hs_HighliteInfixFunctionName,hsType,hsConSym,hsVarSym,hsString,hsCharacter
+sy match hs_HlInfixOp "\(\W\&\S\&[^`(){}'[\]]\)\+" contained contains=hsString
+sy match hs_InfixOpFunctionName "^\(\(\w\|[[\]{}]\)\+\|\(\".*\"\)\|\('.*'\)\)\s*[^:]=*\(\W\&\S\&[^='\"`()[\]{}@]\)\+"
+ \ contained contains=hs_HlInfixOp,hsCharacter
+
+sy match hs_OpFunctionName "(\(\W\&[^(),\"]\)\+)" contained
+"sy region hs_Function start="^["'a-z_([{]" end="=\(\s\|\n\|\w\|[([]\)" keepend extend
+sy region hs_Function start="^["'a-zA-Z_([{]\(\(.\&[^=]\)\|\(\n\s\)\)*=" end="\(\s\|\n\|\w\|[([]\)"
+ \ contains=hs_OpFunctionName,hs_InfixOpFunctionName,hs_InfixFunctionName,hs_FunctionName,hsType,hsConSym,hsVarSym,hsString,hsCharacter
+
+sy match hs_TypeOp "::"
+sy match hs_DeclareFunction "^[a-z_(]\S*\(\s\|\n\)*::" contains=hs_FunctionName,hs_OpFunctionName,hs_TypeOp
+
+" hi hs_TypeOp guibg=red
+
+" hi hs_InfixOpFunctionName guibg=yellow
+" hi hs_Function guibg=green
+" hi hs_InfixFunctionName guibg=red
+" hi hs_DeclareFunction guibg=red
+
+sy keyword hsStructure data family class where instance default deriving
+sy keyword hsTypedef type newtype
+
+sy keyword hsInfix infix infixl infixr
+sy keyword hsStatement do case of let in
+sy keyword hsConditional if then else
+
+"if exists("hs_highlight_types")
+ " Primitive types from the standard prelude and libraries.
+ sy match hsType "\<[A-Z]\(\S\&[^,.]\)*\>"
+ sy match hsType "()"
+"endif
+
+" Not real keywords, but close.
+if exists("hs_highlight_boolean")
+ " Boolean constants from the standard prelude.
+ syn keyword hsBoolean True False
+endif
+
+syn region hsPackageString start=+L\="+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end='$' contains=cSpecial contained
+sy match hsModuleName excludenl "\([A-Z]\w*\.\?\)*" contained
+
+sy match hsImport "\<import\>\s\+\(qualified\s\+\)\?\(\<\(\w\|\.\)*\>\)"
+ \ contains=hsModuleName,hsImportLabel
+ \ nextgroup=hsImportParams,hsImportIllegal skipwhite
+sy keyword hsImportLabel import qualified contained
+
+sy match hsImportIllegal "\w\+" contained
+
+sy keyword hsAsLabel as contained
+sy keyword hsHidingLabel hiding contained
+
+sy match hsImportParams "as\s\+\(\w\+\)" contained
+ \ contains=hsModuleName,hsAsLabel
+ \ nextgroup=hsImportParams,hsImportIllegal skipwhite
+sy match hsImportParams "hiding" contained
+ \ contains=hsHidingLabel
+ \ nextgroup=hsImportParams,hsImportIllegal skipwhite
+sy region hsImportParams start="(" end=")" contained
+ \ contains=hsBlockComment,hsLineComment, hsType,hsDelimTypeExport,hs_hlFunctionName,hs_OpFunctionName
+ \ nextgroup=hsImportIllegal skipwhite
+
+" hi hsImport guibg=red
+"hi hsImportParams guibg=bg
+"hi hsImportIllegal guibg=bg
+"hi hsModuleName guibg=bg
+
+"sy match hsImport "\<import\>\(.\|[^(]\)*\((.*)\)\?"
+" \ contains=hsPackageString,hsImportLabel,hsImportMod,hsModuleName,hsImportList
+"sy keyword hsImportLabel import contained
+"sy keyword hsImportMod as qualified hiding contained
+"sy region hsImportListInner start="(" end=")" contained keepend extend contains=hs_OpFunctionName
+"sy region hsImportList matchgroup=hsImportListParens start="("rs=s+1 end=")"re=e-1
+" \ contained
+" \ keepend extend
+" \ contains=hsType,hsLineComment,hsBlockComment,hs_hlFunctionName,hsImportListInner
+
+
+
+" new module highlighting
+syn region hsDelimTypeExport start="\<[A-Z]\(\S\&[^,.]\)*\>(" end=")" contained
+ \ contains=hsType
+
+sy keyword hsExportModuleLabel module contained
+sy match hsExportModule "\<module\>\(\s\|\t\|\n\)*\([A-Z]\w*\.\?\)*" contained contains=hsExportModuleLabel,hsModuleName
+
+sy keyword hsModuleStartLabel module contained
+sy keyword hsModuleWhereLabel where contained
+
+syn match hsModuleStart "^module\(\s\|\n\)*\(\<\(\w\|\.\)*\>\)\(\s\|\n\)*"
+ \ contains=hsModuleStartLabel,hsModuleName
+ \ nextgroup=hsModuleCommentA,hsModuleExports,hsModuleWhereLabel
+
+syn region hsModuleCommentA start="{-" end="-}"
+ \ contains=hsModuleCommentA,hsCommentTodo,@Spell contained
+ \ nextgroup=hsModuleCommentA,hsModuleExports,hsModuleWhereLabel skipwhite skipnl
+
+syn match hsModuleCommentA "--.*\n"
+ \ contains=hsCommentTodo,@Spell contained
+ \ nextgroup=hsModuleCommentA,hsModuleExports,hsModuleWhereLabel skipwhite skipnl
+
+syn region hsModuleExports start="(" end=")" contained
+ \ nextgroup=hsModuleCommentB,hsModuleWhereLabel skipwhite skipnl
+ \ contains=hsBlockComment,hsLineComment,hsType,hsDelimTypeExport,hs_hlFunctionName,hs_OpFunctionName,hsExportModule
+
+syn match hsModuleCommentB "--.*\n"
+ \ contains=hsCommentTodo,@Spell contained
+ \ nextgroup=hsModuleCommentB,hsModuleWhereLabel skipwhite skipnl
+
+syn region hsModuleCommentB start="{-" end="-}"
+ \ contains=hsModuleCommentB,hsCommentTodo,@Spell contained
+ \ nextgroup=hsModuleCommentB,hsModuleWhereLabel skipwhite skipnl
+" end module highlighting
+
+" FFI support
+sy keyword hsFFIForeign foreign contained
+"sy keyword hsFFIImportExport import export contained
+sy keyword hsFFIImportExport export contained
+sy keyword hsFFICallConvention ccall stdcall contained
+sy keyword hsFFISafety safe unsafe contained
+sy region hsFFIString start=+"+ skip=+\\\\\|\\"+ end=+"+ contained contains=hsSpecialChar
+sy match hsFFI excludenl "\<foreign\>\(.\&[^\"]\)*\"\(.\)*\"\(\s\|\n\)*\(.\)*::"
+ \ keepend
+ \ contains=hsFFIForeign,hsFFIImportExport,hsFFICallConvention,hsFFISafety,hsFFIString,hs_OpFunctionName,hs_hlFunctionName
+
+
+sy match hsNumber "\<[0-9]\+\>\|\<0[xX][0-9a-fA-F]\+\>\|\<0[oO][0-7]\+\>"
+sy match hsFloat "\<[0-9]\+\.[0-9]\+\([eE][-+]\=[0-9]\+\)\=\>"
+
+" Comments
+sy keyword hsCommentTodo TODO FIXME XXX TBD contained
+sy match hsLineComment "---*\([^-!#$%&\*\+./<=>\?@\\^|~].*\)\?$" contains=hsCommentTodo,@Spell
+sy region hsBlockComment start="{-" end="-}" contains=hsBlockComment,hsCommentTodo,@Spell
+sy region hsPragma start="{-#" end="#-}"
+
+" QuasiQuotation
+sy region hsQQ start="\[\$" end="|\]"me=e-2 keepend contains=hsQQVarID,hsQQContent nextgroup=hsQQEnd
+sy region hsQQNew start="\[\(.\&[^|]\&\S\)*|" end="|\]"me=e-2 keepend contains=hsQQVarIDNew,hsQQContent nextgroup=hsQQEnd
+sy match hsQQContent ".*" contained
+sy match hsQQEnd "|\]" contained
+sy match hsQQVarID "\[\$\(.\&[^|]\)*|" contained
+sy match hsQQVarIDNew "\[\(.\&[^|]\)*|" contained
+
+if exists("hs_highlight_debug")
+ " Debugging functions from the standard prelude.
+ syn keyword hsDebug undefined error trace
+endif
+
+
+" C Preprocessor directives. Shamelessly ripped from c.vim and trimmed
+" First, see whether to flag directive-like lines or not
+if (!exists("hs_allow_hash_operator"))
+ syn match cError display "^\s*\(%:\|#\).*$"
+endif
+" Accept %: for # (C99)
+syn region cPreCondit start="^\s*\(%:\|#\)\s*\(if\|ifdef\|ifndef\|elif\)\>" skip="\\$" end="$" end="//"me=s-1 contains=cComment,cCppString,cCommentError
+syn match cPreCondit display "^\s*\(%:\|#\)\s*\(else\|endif\)\>"
+syn region cCppOut start="^\s*\(%:\|#\)\s*if\s\+0\+\>" end=".\@=\|$" contains=cCppOut2
+syn region cCppOut2 contained start="0" end="^\s*\(%:\|#\)\s*\(endif\>\|else\>\|elif\>\)" contains=cCppSkip
+syn region cCppSkip contained start="^\s*\(%:\|#\)\s*\(if\>\|ifdef\>\|ifndef\>\)" skip="\\$" end="^\s*\(%:\|#\)\s*endif\>" contains=cCppSkip
+syn region cIncluded display contained start=+"+ skip=+\\\\\|\\"+ end=+"+
+syn match cIncluded display contained "<[^>]*>"
+syn match cInclude display "^\s*\(%:\|#\)\s*include\>\s*["<]" contains=cIncluded
+syn cluster cPreProcGroup contains=cPreCondit,cIncluded,cInclude,cDefine,cCppOut,cCppOut2,cCppSkip,cCommentStartError
+syn region cDefine matchgroup=cPreCondit start="^\s*\(%:\|#\)\s*\(define\|undef\)\>" skip="\\$" end="$"
+syn region cPreProc matchgroup=cPreCondit start="^\s*\(%:\|#\)\s*\(pragma\>\|line\>\|warning\>\|warn\>\|error\>\)" skip="\\$" end="$" keepend
+
+syn region cComment matchgroup=cCommentStart start="/\*" end="\*/" contains=cCommentStartError,cSpaceError contained
+syntax match cCommentError display "\*/" contained
+syntax match cCommentStartError display "/\*"me=e-1 contained
+syn region cCppString start=+L\="+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end='$' contains=cSpecial contained
+
+
+if version >= 508 || !exists("did_hs_syntax_inits")
+ if version < 508
+ let did_hs_syntax_inits = 1
+ command -nargs=+ HiLink hi link <args>
+ else
+ command -nargs=+ HiLink hi def link <args>
+ endif
+
+ HiLink hs_hlFunctionName Function
+ HiLink hs_HighliteInfixFunctionName Function
+ HiLink hs_HlInfixOp Function
+ HiLink hs_OpFunctionName Function
+ HiLink hsTypedef Typedef
+ HiLink hsVarSym hsOperator
+ HiLink hsConSym hsOperator
+ if exists("hs_highlight_delimiters")
+ " Some people find this highlighting distracting.
+ HiLink hsDelimiter Delimiter
+ endif
+
+ HiLink hsModuleStartLabel Structure
+ HiLink hsExportModuleLabel Keyword
+ HiLink hsModuleWhereLabel Structure
+ HiLink hsModuleName Normal
+
+ HiLink hsImportIllegal Error
+ HiLink hsAsLabel hsImportLabel
+ HiLink hsHidingLabel hsImportLabel
+ HiLink hsImportLabel Include
+ HiLink hsImportMod Include
+ HiLink hsPackageString hsString
+
+ HiLink hsOperator Operator
+
+ HiLink hsInfix Keyword
+ HiLink hsStructure Structure
+ HiLink hsStatement Statement
+ HiLink hsConditional Conditional
+
+ HiLink hsSpecialCharError Error
+ HiLink hsSpecialChar SpecialChar
+ HiLink hsString String
+ HiLink hsFFIString String
+ HiLink hsCharacter Character
+ HiLink hsNumber Number
+ HiLink hsFloat Float
+
+ HiLink hsLiterateComment hsComment
+ HiLink hsBlockComment hsComment
+ HiLink hsLineComment hsComment
+ HiLink hsModuleCommentA hsComment
+ HiLink hsModuleCommentB hsComment
+ HiLink hsComment Comment
+ HiLink hsCommentTodo Todo
+ HiLink hsPragma SpecialComment
+ HiLink hsBoolean Boolean
+
+ if exists("hs_highlight_types")
+ HiLink hsDelimTypeExport hsType
+ HiLink hsType Type
+ endif
+
+ HiLink hsDebug Debug
+
+ HiLink hs_TypeOp hsOperator
+
+ HiLink cCppString hsString
+ HiLink cCommentStart hsComment
+ HiLink cCommentError hsError
+ HiLink cCommentStartError hsError
+ HiLink cInclude Include
+ HiLink cPreProc PreProc
+ HiLink cDefine Macro
+ HiLink cIncluded hsString
+ HiLink cError Error
+ HiLink cPreCondit PreCondit
+ HiLink cComment Comment
+ HiLink cCppSkip cCppOut
+ HiLink cCppOut2 cCppOut
+ HiLink cCppOut Comment
+
+ HiLink hsFFIForeign Keyword
+ HiLink hsFFIImportExport Structure
+ HiLink hsFFICallConvention Keyword
+ HiLink hsFFISafety Keyword
+
+ HiLink hsTHIDTopLevel Macro
+ HiLink hsTHTopLevelName Macro
+
+ HiLink hsQQVarID Keyword
+ HiLink hsQQVarIDNew Keyword
+ HiLink hsQQEnd Keyword
+ HiLink hsQQContent String
+
+ delcommand HiLink
+endif
+
+let b:current_syntax = "haskell"
+

0 comments on commit d243283

Please sign in to comment.