2 if exists("b:current_syntax")
6 " this file uses line continuation
10 " Lexical structure, keywords and comments
11 """"""""""""""""""""""""""""""""""""""""""
13 " set iskeyword for this syntax script
14 syn iskeyword a-z,A-Z,48-57,192-255,-,.
17 syn match cabalComment /--.*$/
24 syn keyword cabalBuildType contained
29 " test-suite,benchmark: exitcode-stdio-1.0, detailed-0.9
30 " foreign-library: native-shared, native-static
31 " source-repository: git, ...
32 syn keyword cabalCompType contained
35 \ native-shared native-static
36 \ cvs svn darcs mercurial git
38 syn keyword cabalLanguage contained
44 " To update this in Cabal, `cabal repl Cabal` and:
45 " >>> :m *Distribution.PackageDescription.FieldGrammar
46 " >>> _syntaxFieldNames
47 syn keyword cabalFieldName contained
80 \ extra-bundled-libraries
82 \ extra-dynamic-library-flavours
84 \ extra-framework-dirs
85 \ extra-ghci-libraries
88 \ extra-library-flavours
97 \ ghcjs-shared-options
143 " To update this in Cabal, `cabal repl Cabal` and:
144 " >>> :m *Distribution.PackageDescription.FieldGrammar
145 " >>> _syntaxExtensions
146 syn keyword cabalExtension contained
150 \ AllowAmbiguousTypes
160 \ ConstrainedClassMethods
175 \ DisambiguateRecordFields
178 \ DuplicateRecordFields
182 \ ExistentialQuantification
185 \ ExtendedDefaultRules
191 \ ForeignFunctionInterface
192 \ FunctionalDependencies
195 \ GHCForeignImportPrim
196 \ GeneralisedNewtypeDeriving
197 \ GeneralizedNewtypeDeriving
203 \ ImportQualifiedPost
205 \ IncoherentInstances
212 \ LiberalTypeSynonyms
215 \ RequiredTypeArguments
217 \ MonadComprehensions
218 \ MonadFailDesugaring
221 \ MonomorphismRestriction
223 \ MultiParamTypeClasses
230 \ NewQualifiedOperators
231 \ NondecreasingIndentation
236 \ OverlappingInstances
239 \ OverloadedRecordDot
244 \ PartialTypeSignatures
249 \ PolymorphicComponents
252 \ QuantifiedConstraints
262 \ RestrictedTypeSynonyms
265 \ ScopedTypeVariables
267 \ StandaloneKindSignatures
273 \ TemplateHaskellQuotes
274 \ TraditionalRecordSyntax
281 \ TypeFamilyDependencies
284 \ TypeSynonymInstances
287 \ UndecidableInstances
288 \ UndecidableSuperClasses
295 \ NoAllowAmbiguousTypes
298 \ NoAutoDeriveTypeable
305 \ NoConstrainedClassMethods
309 \ NoDefaultSignatures
312 \ NoDeriveDataTypeable
317 \ NoDeriveTraversable
318 \ NoDerivingStrategies
320 \ NoDisambiguateRecordFields
323 \ NoDuplicateRecordFields
326 \ NoEmptyDataDeriving
327 \ NoExistentialQuantification
329 \ NoExplicitNamespaces
330 \ NoExtendedDefaultRules
332 \ NoExtensibleRecords
335 \ NoFlexibleInstances
336 \ NoForeignFunctionInterface
337 \ NoFunctionalDependencies
340 \ NoGHCForeignImportPrim
341 \ NoGeneralisedNewtypeDeriving
342 \ NoGeneralizedNewtypeDeriving
348 \ NoImportQualifiedPost
349 \ NoImpredicativeTypes
350 \ NoIncoherentInstances
357 \ NoLiberalTypeSynonyms
359 \ NoRequiredTypeArguments
361 \ NoMonadComprehensions
362 \ NoMonadFailDesugaring
365 \ NoMonomorphismRestriction
367 \ NoMultiParamTypeClasses
374 \ NoNewQualifiedOperators
375 \ NoNondecreasingIndentation
376 \ NoNullaryTypeClasses
378 \ NoNumericUnderscores
379 \ NoOverlappingInstances
382 \ NoOverloadedRecordDot
383 \ NoOverloadedStrings
388 \ NoPartialTypeSignatures
390 \ NoPatternSignatures
393 \ NoPolymorphicComponents
396 \ NoQuantifiedConstraints
406 \ NoRestrictedTypeSynonyms
409 \ NoScopedTypeVariables
410 \ NoStandaloneDeriving
411 \ NoStandaloneKindSignatures
417 \ NoTemplateHaskellQuotes
418 \ NoTraditionalRecordSyntax
419 \ NoTransformListComp
425 \ NoTypeFamilyDependencies
428 \ NoTypeSynonymInstances
431 \ NoUndecidableInstances
432 \ NoUndecidableSuperClasses
434 \ NoUnliftedDatatypes
440 " Cabal format is (mostly) case-insensitive
446 " Top level stanzas, cannot be nested, only library can be have optional name
447 syn match cabalStanzaLineRegion
448 \ /^\clibrary\(\s\+\k\+\)\=\s*$/
450 " Top level stanzas with an identifier
451 syn match cabalStanzaLineRegion
452 \ /^\c\(flag\|common\|source-repository\|executable\|test-suite\|benchmark\|foreign-library\)\s\+\k\+\s*$/
454 " Conditionals are nested
455 syn match cabalConditionalRegion
456 \ contains=cabalOperator,cabalBoolean
457 \ /^\c\s\+\(if\|elif\|else\)[^:]*$/
460 syn match cabalFieldRegion
461 \ /^[a-zA-Z0-9-]\+\s*:.*\n\(\s\+.*\n\|\s*\n\)*/
465 " We use backreferences to fake the recognition of indentation.
466 " Unfortunately I don't know a way to anchor contained
467 " matches to the boundaries of the enclosing region.
468 syn match cabalFieldRegion
469 \ /^\(\s\+\)[a-zA-Z0-9-]\+\s*:.*\n\(\1\s\+.*\n\|\s*\n\)*/
474 syn match cabalCategoryTitle
478 syn keyword cabalCategory
479 \ contained containedin=cabalStanzaLineRegion
480 \ nextgroup=cabalCategoryTitle skipwhite
481 \ flag common source-repository library executable test-suite benchmark foreign-library
486 syn match cabalOperator contained /&&\|||\|!/
487 syn match cabalVersionOperator contained /==\|\^\?>=\|<=\|<\|>/
488 " match version: `[%]\@<!` is to exclude `%20` in http addresses.
489 syn match cabalVersion contained /[%$_-]\@<!\<\d\+\%(\.\d\+\)*\%(\.\*\)\?\>/
490 " cabalVersionRegion which limits the scope of cabalVersion pattern.
491 syn match cabalVersionRegion
492 \ contains=cabalVersionOperator,cabalVersion
494 \ /\%(==\|\^\?>=\|<=\|<\|>\)\s*\d\+\%(\.\d\+\)*\%(\.\*\)\?\>/
499 syn keyword cabalCompiler contained ghc nhc yhc hugs hbc helium jhc lhc
504 syn keyword cabalConditional contained containedin=cabalConditionalRegion
507 syn keyword cabalFunction contained
510 syn region cabalFunctionRegion start=+\(os\|arch\|impl\|flag\)\s*(+ end=+)+
511 \ contained containedin=cabalConditionalRegion
512 \ contains=cabalOs,cabalFunction,cabalCompiler,cabalVersionRegion
517 syn match cabalImportName contained /\c\<[a-z0-9-]\+\>/
518 syn keyword cabalImport contained import
519 syn match cabalImportRegion
520 \ contains=cabalImport,cabalColon,cabalImportName
521 \ /^\c\(\s\+\)import\s*:.*\n\(\1\s\+.*\n\|\s*\n\)*/
526 syn match cabalFieldNameRegion contained containedin=cabalFieldRegion
527 \ contains=cabalFieldName
528 \ /^\s*[a-zA-Z0-9-]\+\s*:/
530 syn match cabalColon contained containedin=cabalFieldNameRegion
534 """""""""""""""""""""""""""""""""
536 syn keyword cabalBoolean contained containedin=cabalFieldRegion
540 syn match cabalSpecVersion contained
541 \ /\(>=\s*1\.\(0\|2\|4\|6\|8\|10\)\|1\.\(12\|16\|18\|20\|22\|24\)\|2\.\(0\|2\|4\)\|3\.\(\0\|4\|6\)\)/
542 syn match cabalSpecVersionRegion
543 \ contained containedin=cabalFieldRegion
544 \ contains=cabalFieldNameRegion,cabalSpecVersion
545 \ /\c^cabal-version\s*:.*\n\(\s\+.*\n\|\s*\n\)*/
548 syn match cabalPkgVersionRegion
549 \ contained containedin=cabalFieldRegion
550 \ contains=cabalFieldNameRegion,cabalVersion
551 \ /\c^version\s*:.*\n\(\s\+.*\n\|\s*\n\)*/
554 syn match cabalDescriptionNameRegion
556 \ contains=cabalFieldName
558 syn match cabalDescriptionRegion
559 \ contained containedin=cabalFieldRegion
560 \ contains=cabalDescriptionNameRegion
561 \ /\c^description\s*:.*\n\(\s\+.*\n\|\s*\n\)*/
564 syn match cabalTestedWithRegion
565 \ contained containedin=cabalFieldRegion
566 \ contains=cabalFieldNameRegion,cabalVersionRegion,cabalOperator,cabalCompiler
567 \ /\c^tested-with\s*:.*\n\(\s\+.*\n\|\s*\n\)*/
569 " build-depends,build-tool-depends
571 " fields with version ranges
572 syn match cabalDependsRegion
573 \ contained containedin=cabalFieldRegion
574 \ contains=cabalFieldNameRegion,cabalVersionRegion,cabalOperator
575 \ /\c^\(\s\+\)\(build-depends\|build-tool-depends\)\s*:.*\n\(\1\s\+.*\n\|\s*\n\)*/
578 syn match cabalBuildTypeRegion
579 \ contained containedin=cabalFieldRegion
580 \ contains=cabalFieldNameRegion,cabalBuildType
581 \ /\c^build-type\s*:.*\n\(\s\+.*\n\|\s*\n\)*/
584 syn match cabalCompTypeRegion
585 \ contained containedin=cabalFieldRegion
586 \ contains=cabalFieldNameRegion,cabalCompType
587 \ /\c^\(\s\+\)type\s*:.*\n\(\1\s\+.*\n\|\s*\n\)*/
589 " default-extensions other-extensions extensions
590 syn match cabalExtensionsRegion
591 \ contained containedin=cabalFieldRegion
592 \ contains=cabalFieldNameRegion,cabalExtension
593 \ /^\c\(\s\+\)\(default-extensions\|other-extensions\|extensions\)\s*:.*\n\(\1\s\+.*\n\|\s*\n\)*/
595 " default-language other-languages
596 syn match cabalLanguagesRegion
597 \ contained containedin=cabalFieldRegion
598 \ contains=cabalFieldNameRegion,cabalLanguage
599 \ /^\c\(\s\+\)\(default-language\|other-languages\)\s*:.*\n\(\1\s\+.*\n\|\s*\n\)*/
601 " Define the default highlighting
602 """""""""""""""""""""""""""""""""
604 hi link cabalComment Comment
606 " We highlight stanza region, as it makes component name highlighted
607 hi link cabalStanzaLineRegion NONE
608 hi link cabalFieldRegion NONE
609 hi link cabalFieldNameRegion NONE
610 hi link cabalConditionalRegion NONE
612 hi link cabalCategory Type
613 hi link cabalCategoryTitle Title
615 hi link cabalImport Type
616 hi link cabalImportName Title
618 hi link cabalFunction Function
620 hi link cabalConditional Conditional
621 hi link cabalOperator Operator
622 hi link cabalVersionOperator Special
623 hi link cabalSpecVersion Special
624 hi link cabalVersion Special
626 hi link cabalFieldName Keyword
627 hi link cabalColon Operator
628 hi link cabalBoolean Boolean
630 hi link cabalBuildType Constant
631 hi link cabalCompiler Constant
632 hi link cabalCompType Constant
633 hi link cabalExtension Constant
634 hi link cabalLanguage Constant
635 hi link cabalOs Constant
637 let b:current_syntax="mini-cabal"