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

caseinsensitive

context default

# cabal keywords

#   reserved keywords:

#comments
    keyword -- brown

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

#   known fields
    keyword whole \[\s\]author cyan
    keyword whole \[\s\]bug-reports cyan
    keyword whole \[\s\]buildable cyan
    keyword whole \[\s\]build-depends cyan
    keyword whole \[\s\]build-tools cyan
    keyword whole \[\s\]build-type cyan
    keyword whole \[\s\]cabal-version cyan
    keyword whole \[\s\]category cyan
    keyword whole \[\s\]cc-options cyan
    keyword whole \[\s\]copyright cyan
    keyword whole \[\s\]cpp-options cyan
    keyword whole \[\s\]c-sources cyan
    keyword whole \[\s\]data-dir cyan
    keyword whole \[\s\]data-files cyan
    keyword whole \[\s\]default-language cyan
    keyword whole \[\s\]default cyan
    keyword whole \[\s\]description cyan
    keyword whole \[\s\]exposed-modules cyan
    keyword whole \[\s\]exposed cyan
    keyword whole \[\s\]extensions cyan
    keyword whole \[\s\]extra-lib-dirs cyan
    keyword whole \[\s\]extra-libraries cyan
    keyword whole \[\s\]extra-source-files cyan
    keyword whole \[\s\]extra-tmp-files cyan
    keyword whole \[\s\]frameworks cyan
    keyword whole \[\s\]ghc-options cyan
    keyword whole \[\s\]ghc-prof-options cyan
    keyword whole \[\s\]ghc-shared-options cyan
    keyword whole \[\s\]homepage cyan
    keyword whole \[\s\]hs-source-dirs cyan
    keyword whole \[\s\]hugs-options cyan
    keyword whole \[\s\]include-dirs cyan
    keyword whole \[\s\]includes cyan
    keyword whole \[\s\]install-includes cyan
    keyword whole \[\s\]jhc-options cyan
    keyword whole \[\s\]ld-options cyan
    keyword whole \[\s\]license-file cyan
    keyword whole \[\s\]license cyan
    keyword whole \[\s\]location cyan
    keyword whole \[\s\]main-is cyan
    keyword whole \[\s\]maintainer cyan
    keyword whole \[\s\]name cyan
    keyword whole \[\s\]nhc98-options cyan
    keyword whole \[\s\]other-extensions cyan
    keyword whole \[\s\]other-modules cyan
    keyword whole \[\s\]package-url cyan
    keyword whole \[\s\]pkgconfig-depends cyan
    keyword whole \[\s\]source-repository cyan
    keyword whole \[\s\]stability cyan
    keyword whole \[\s\]synopsis cyan
    keyword whole \[\s\]tag cyan
    keyword whole \[\s\]tested-with cyan
    keyword whole \[\s\]type cyan
    keyword whole \[\s\]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://+ gray
    keyword ftp://+ gray
    keyword git://+ gray
    keyword cvs://+ gray
    keyword svn://+ gray
    keyword darcs://+ gray
#   special text inside of <>, i.e. emails
    keyword \<+\> red

#   build types with '\s & \n' hack to remove too stupid highlighting
    keyword whole Configure\s white
    keyword whole Configure\n white
    keyword whole Custom\s white
    keyword whole Custom\n white
    keyword whole Make\s white
    keyword whole Make\n white
    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

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

#   special keywords
    keyword whole True white
    keyword whole False white
    keyword whole if white
    keyword whole else white
    keyword whole os white
    keyword whole impl white
    keyword whole arch white

    keyword whole linestart \[\s\]executable yellow
    keyword whole linestart \[\s\]library yellow
    keyword whole linestart \[\s\]test-suite yellow
    keyword whole flag yellow
    keyword whole repo yellow


#   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 // \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
