|
|
@@ -0,0 +1,354 @@ |
|
|
" 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_DeclareFunction "^[a-z_(]\S*\(\s\|\n\)*::" contains=hs_FunctionName,hs_OpFunctionName |
|
|
|
|
|
" hi hs_InfixOpFunctionName guibg=bg |
|
|
" 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 match hsImportParams "\(\w\*\)" 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 match hsModuleExports "\(\w\*\)" 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 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" |