# Author   : Mikhail S. Pobolovets
# Language : cabal
#
# haskell.syntax is taken as base
#

context default

# cabal keywords

#   reserved keywords:

#comments
    keyword -- brown

#   unused symbols
    keyword whole _\[0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz\] magenta

#   known fields
    keyword whole author cyan
    keyword whole bug-reports cyan
    keyword whole buildable cyan
    keyword whole build-depends cyan
    keyword whole build-tools cyan
    keyword whole build-type cyan
    keyword whole cabal-version cyan
    keyword whole category cyan
    keyword whole cc-options cyan
    keyword whole copyright cyan
    keyword whole cpp-options cyan
    keyword whole c-sources cyan
    keyword whole data-dir cyan
    keyword whole data-files cyan
    keyword whole description cyan
    keyword whole executable cyan
    keyword whole exposed-modules cyan
    keyword whole exposed cyan
    keyword whole extensions cyan
    keyword whole extra-lib-dirs cyan
    keyword whole extra-libraries cyan
    keyword whole extra-source-files cyan
    keyword whole extra-tmp-files cyan
    keyword whole frameworks cyan
    keyword whole ghc-options cyan
    keyword whole ghc-prof-options cyan
    keyword whole ghc-shared-options cyan
    keyword whole homepage cyan
    keyword whole hs-source-dirs cyan
    keyword whole hugs-options cyan
    keyword whole include-dirs cyan
    keyword whole includes cyan
    keyword whole install-includes cyan
    keyword whole jhc-options cyan
    keyword whole ld-options cyan
    keyword whole library cyan
    keyword whole license-file cyan
    keyword whole license cyan
    keyword whole main-is cyan
    keyword whole maintainer cyan
    keyword whole name cyan
    keyword whole nhc98-options cyan
    keyword whole other-modules cyan
    keyword whole package-url cyan
    keyword whole pkgconfig-depends cyan
    keyword whole stability cyan
    keyword whole synopsis cyan
    keyword whole tested-with cyan
    keyword whole version cyan

#   extended fields
    keyword whole x\-\[0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz\] cyan

#   version wildcard
    keyword whole -any red

#   commandline keys
    keyword whole -\[0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz_0123456789\] brightred

#   known extensions
    keyword whole Arrows                      brightmagenta
    keyword whole BangPatterns                brightmagenta
    keyword whole ConstrainedClassMethods     brightmagenta
    keyword whole DeriveDataTypeable          brightmagenta
    keyword whole DisambiguateRecordFields    brightmagenta
    keyword whole EmptyDataDecls              brightmagenta
    keyword whole CPP                         brightmagenta
    keyword whole ExistentialQuantification   brightmagenta
    keyword whole ExtendedDefaultRules        brightmagenta
    keyword whole ExtensibleRecords           brightmagenta
    keyword whole FlexibleContexts            brightmagenta
    keyword whole FlexibleInstances           brightmagenta
    keyword whole ForeignFunctionInterface    brightmagenta
    keyword whole FunctionalDependencies      brightmagenta
    keyword whole GADTs                       brightmagenta
    keyword whole GeneralizedNewtypeDeriving  brightmagenta
    keyword whole Generics                    brightmagenta
    keyword whole HereDocuments               brightmagenta
    keyword whole ImplicitParams              brightmagenta
    keyword whole ImpredicativeTypes          brightmagenta
    keyword whole IncoherentInstances         brightmagenta
    keyword whole KindSignatures              brightmagenta
    keyword whole LiberalTypeSynonyms         brightmagenta
    keyword whole MagicHash                   brightmagenta
    keyword whole MultiParamTypeClasses       brightmagenta
    keyword whole NamedFieldPuns              brightmagenta
    keyword whole NewQualifiedOperators       brightmagenta
    keyword whole NoImplicitPrelude           brightmagenta
    keyword whole NoMonomorphismRestriction   brightmagenta
    keyword whole NoMonoPatBinds              brightmagenta
    keyword whole OverlappingInstances        brightmagenta
    keyword whole OverloadedStrings           brightmagenta
    keyword whole PackageImports              brightmagenta
    keyword whole ParallelListComp            brightmagenta
    keyword whole PatternGuards               brightmagenta
    keyword whole PatternSignatures           brightmagenta
    keyword whole PolymorphicComponents       brightmagenta
    keyword whole PostfixOperators            brightmagenta
    keyword whole QuasiQuotes                 brightmagenta
    keyword whole Rank2Types                  brightmagenta
    keyword whole RankNTypes                  brightmagenta
    keyword whole RecordPuns                  brightmagenta
    keyword whole RecordWildCards             brightmagenta
    keyword whole RecursiveDo                 brightmagenta
    keyword whole RelaxedPolyRec              brightmagenta
    keyword whole RestrictedTypeSynonyms      brightmagenta
    keyword whole ScopedTypeVariables         brightmagenta
    keyword whole StandaloneDeriving          brightmagenta
    keyword whole TemplateHaskell             brightmagenta
    keyword whole TransformListComp           brightmagenta
    keyword whole TypeFamilies                brightmagenta
    keyword whole TypeOperators               brightmagenta
    keyword whole TypeSynonymInstances        brightmagenta
    keyword whole UnboxedTuples               brightmagenta
    keyword whole UndecidableInstances        brightmagenta
    keyword whole UnicodeSyntax               brightmagenta
    keyword whole UnliftedFFITypes            brightmagenta
    keyword whole ViewPatterns                brightmagenta

#   links
    keyword http://+  blue
    keyword ftp://+   blue
    keyword git://+   blue
    keyword cvs://+   blue
    keyword svn://+   blue
    keyword darcs://+ blue
#   emails
    keyword \<+\>     red

#   build types
    keyword whole Configure white
    keyword whole Custom    white
    keyword whole Make      white
#   with hack
    keyword whole Simple\n  white
    keyword whole Simple\s  white

#   licenses
    keyword whole AllRightsReserved white
    keyword whole OtherLicense      white
    keyword whole PublicDomain      white
    keyword whole LGPL              white
    keyword whole GPL               white
    keyword whole LGPL2             white
    keyword whole GPL2              white
    keyword whole LGPL3             white
    keyword whole GPL3              white
    keyword whole BSD               white
    keyword whole BSD3              white
    keyword whole BSD4              white
    keyword whole MIT               white

#   compillers
    keyword whole GHC            white
    keyword whole NHC            white
    keyword whole JHC            white
    keyword whole HBC            white
    keyword whole Helium         white
    keyword whole Hugs           white

#   types
    keyword whole True  white
    keyword whole False white

#   unboxed (started from upcase)
#    keyword whole \{ABCDEFGHIJKLMNOPQRSTUVWXYZ\}\[0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz\]# white
#   types/modules
#    keyword whole \{ABCDEFGHIJKLMNOPQRSTUVWXYZ\}\[0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz\] white

#digits
    keyword whole 0\{xX\}\{0123456789abcdefABCDEF\}\[0123456789abcdefABCDEF\]       brightgreen
    keyword whole \{0123456789\}\[0123456789\]      brightgreen
    keyword whole \[0123456789\]\.\{0123456789\}\[0123456789\]      brightgreen
    keyword whole \{0123456789\}\[0123456789\]\.\[0123456789\]      brightgreen
    keyword whole \{0123456789\}\[0123456789\]\{eE\}\{0123456789\}\[0123456789\]    brightgreen
    keyword whole \{0123456789\}\[0123456789\]\{eE\}\{\-\+\}\{0123456789\}\[0123456789\]    brightgreen
    keyword whole \{0123456789\}\[0123456789\]\.\{0123456789\}\[0123456789\]\{eE\}\{0123456789\}\[0123456789\]      brightgreen
    keyword whole \{0123456789\}\[0123456789\]\.\{0123456789\}\[0123456789\]\{eE\}\{\-\+\}\{0123456789\}\[0123456789\]      brightgreen


# some punctuation characters
    keyword whole $ yellow
    keyword whole ! white
    keyword whole && white
    keyword whole \* yellow
    keyword whole \+ yellow
    keyword whole / yellow
    keyword whole ^ white
    keyword whole || white
    keyword whole | white

    keyword ~ white
    keyword , brightcyan
    keyword - yellow
    keyword : brightcyan
    keyword ; yellow
    keyword = yellow
    keyword < yellow
    keyword > yellow
    keyword { white
    keyword } white
    keyword [ brightcyan
    keyword ] brightcyan
    keyword ( brightcyan
    keyword ) brightcyan

# comments
context exclusive /\* \*/ brown
    spellcheck

context exclusive {- -} brown
    spellcheck

context exclusive // \n brown
    spellcheck

context exclusive \-\- \n brown
    spellcheck

context " " green
    spellcheck

    keyword \\" brightgreen
    keyword %% brightgreen
    keyword %\[#0\s-\+,\]\[0123456789\*\]\[.\]\[0123456789\*\]\[L\]\{eEfgGoxX\} brightgreen
    keyword %\[0\s-\+,\]\[0123456789\*\]\[.\]\[0123456789\*\]\[hl\]\{diuxX\} brightgreen
    keyword %\[hl\]n brightgreen
    keyword %\[-\]\[0123456789\*\]\[.\]\[0123456789\*\]s brightgreen
    keyword %[*] brightgreen
    keyword %c brightgreen
    keyword %p brightgreen
    keyword \\\{0123\}\{01234567\}\{01234567\} brightgreen
    keyword \\\\ brightgreen
    keyword \\' brightgreen
    keyword \\\{abtnvfr\} brightgreen

# infix binop
context exclusive ` ` white