Merge pull request #10428 from 9999years/add-validate-tasty-arg
[cabal.git] / editors / vim / syntax / cabal.vim
blob2e578307a7ecf50842c139f448f25277096574bd
1 " Vim syntax file
2 if exists("b:current_syntax")
3   finish
4 endif
6 " this file uses line continuation
7 let s:cpo_save = &cpo
8 set cpo&vim
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,-,.
16 " Comments
17 syn match cabalComment    /--.*$/
19 " Enumerations
20 """"""""""""""
22 syn case match
24 syn keyword cabalBuildType contained
25   \ Simple
26   \ Configure
27   \ Custom
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
33   \ exitcode-stdio-1.0
34   \ detailed-0.0
35   \ native-shared native-static
36   \ cvs svn darcs mercurial git
38 syn keyword cabalLanguage contained
39   \ Haskell98
40   \ Haskell2010
41   \ GHC2021
42   \ GHC2024
44 " To update this in Cabal, `cabal repl Cabal` and:
45 " >>> :m *Distribution.PackageDescription.FieldGrammar
46 " >>> _syntaxFieldNames
47 syn keyword cabalFieldName contained
48   \ asm-options
49   \ asm-sources
50   \ author
51   \ autogen-includes
52   \ autogen-modules
53   \ benchmark-module
54   \ branch
55   \ bug-reports
56   \ build-depends
57   \ build-tool-depends
58   \ build-tools
59   \ build-type
60   \ buildable
61   \ c-sources
62   \ cabal-version
63   \ category
64   \ cc-options
65   \ cmm-options
66   \ cmm-sources
67   \ copyright
68   \ cpp-options
69   \ cxx-options
70   \ cxx-sources
71   \ data-dir
72   \ data-files
73   \ default
74   \ default-extensions
75   \ default-language
76   \ description
77   \ exposed
78   \ exposed-modules
79   \ extensions
80   \ extra-bundled-libraries
81   \ extra-doc-files
82   \ extra-dynamic-library-flavours
83   \ extra-files
84   \ extra-framework-dirs
85   \ extra-ghci-libraries
86   \ extra-lib-dirs
87   \ extra-libraries
88   \ extra-library-flavours
89   \ extra-source-files
90   \ extra-tmp-files
91   \ frameworks
92   \ ghc-options
93   \ ghc-prof-options
94   \ ghc-shared-options
95   \ ghcjs-options
96   \ ghcjs-prof-options
97   \ ghcjs-shared-options
98   \ homepage
99   \ hs-source-dir
100   \ hs-source-dirs
101   \ hsc2hs-options
102   \ hugs-options
103   \ include-dirs
104   \ includes
105   \ install-includes
106   \ jhc-options
107   \ js-sources
108   \ ld-options
109   \ lib-version-info
110   \ lib-version-linux
111   \ license
112   \ license-file
113   \ license-files
114   \ location
115   \ main-is
116   \ maintainer
117   \ manual
118   \ mixins
119   \ mod-def-file
120   \ module
121   \ name
122   \ nhc98-options
123   \ options
124   \ other-extensions
125   \ other-languages
126   \ other-modules
127   \ package-url
128   \ pkgconfig-depends
129   \ reexported-modules
130   \ scope
131   \ setup-depends
132   \ signatures
133   \ stability
134   \ subdir
135   \ synopsis
136   \ tag
137   \ test-module
138   \ tested-with
139   \ type
140   \ version
141   \ virtual-modules
143 " To update this in Cabal, `cabal repl Cabal` and:
144 " >>> :m *Distribution.PackageDescription.FieldGrammar
145 " >>> _syntaxExtensions
146 syn keyword cabalExtension contained
147   \ Safe
148   \ Trustworthy
149   \ Unsafe
150   \ AllowAmbiguousTypes
151   \ ApplicativeDo
152   \ Arrows
153   \ AutoDeriveTypeable
154   \ BangPatterns
155   \ BinaryLiterals
156   \ BlockArguments
157   \ CApiFFI
158   \ CPP
159   \ CUSKs
160   \ ConstrainedClassMethods
161   \ ConstraintKinds
162   \ DataKinds
163   \ DatatypeContexts
164   \ DefaultSignatures
165   \ DeepSubsumption
166   \ DeriveAnyClass
167   \ DeriveDataTypeable
168   \ DeriveFoldable
169   \ DeriveFunctor
170   \ DeriveGeneric
171   \ DeriveLift
172   \ DeriveTraversable
173   \ DerivingStrategies
174   \ DerivingVia
175   \ DisambiguateRecordFields
176   \ DoAndIfThenElse
177   \ DoRec
178   \ DuplicateRecordFields
179   \ EmptyCase
180   \ EmptyDataDecls
181   \ EmptyDataDeriving
182   \ ExistentialQuantification
183   \ ExplicitForAll
184   \ ExplicitNamespaces
185   \ ExtendedDefaultRules
186   \ ExtendedLiterals
187   \ ExtensibleRecords
188   \ FieldSelectors
189   \ FlexibleContexts
190   \ FlexibleInstances
191   \ ForeignFunctionInterface
192   \ FunctionalDependencies
193   \ GADTSyntax
194   \ GADTs
195   \ GHCForeignImportPrim
196   \ GeneralisedNewtypeDeriving
197   \ GeneralizedNewtypeDeriving
198   \ Generics
199   \ HereDocuments
200   \ HexFloatLiterals
201   \ ImplicitParams
202   \ ImplicitPrelude
203   \ ImportQualifiedPost
204   \ ImpredicativeTypes
205   \ IncoherentInstances
206   \ InstanceSigs
207   \ InterruptibleFFI
208   \ JavaScriptFFI
209   \ KindSignatures
210   \ LambdaCase
211   \ LexicalNegation
212   \ LiberalTypeSynonyms
213   \ LinearTypes
214   \ ListTuplePuns
215   \ RequiredTypeArguments
216   \ MagicHash
217   \ MonadComprehensions
218   \ MonadFailDesugaring
219   \ MonoLocalBinds
220   \ MonoPatBinds
221   \ MonomorphismRestriction
222   \ MultilineStrings
223   \ MultiParamTypeClasses
224   \ MultiWayIf
225   \ NPlusKPatterns
226   \ NamedDefaults
227   \ NamedFieldPuns
228   \ NamedWildCards
229   \ NegativeLiterals
230   \ NewQualifiedOperators
231   \ NondecreasingIndentation
232   \ NullaryTypeClasses
233   \ NumDecimals
234   \ NumericUnderscores
235   \ OrPatterns
236   \ OverlappingInstances
237   \ OverloadedLabels
238   \ OverloadedLists
239   \ OverloadedRecordDot
240   \ OverloadedStrings
241   \ PackageImports
242   \ ParallelArrays
243   \ ParallelListComp
244   \ PartialTypeSignatures
245   \ PatternGuards
246   \ PatternSignatures
247   \ PatternSynonyms
248   \ PolyKinds
249   \ PolymorphicComponents
250   \ PostfixOperators
251   \ QualifiedDo
252   \ QuantifiedConstraints
253   \ QuasiQuotes
254   \ Rank2Types
255   \ RankNTypes
256   \ RebindableSyntax
257   \ RecordPuns
258   \ RecordWildCards
259   \ RecursiveDo
260   \ RegularPatterns
261   \ RelaxedPolyRec
262   \ RestrictedTypeSynonyms
263   \ RoleAnnotations
264   \ SafeImports
265   \ ScopedTypeVariables
266   \ StandaloneDeriving
267   \ StandaloneKindSignatures
268   \ StarIsType
269   \ StaticPointers
270   \ Strict
271   \ StrictData
272   \ TemplateHaskell
273   \ TemplateHaskellQuotes
274   \ TraditionalRecordSyntax
275   \ TransformListComp
276   \ TupleSections
277   \ TypeAbstractions
278   \ TypeApplications
279   \ TypeData
280   \ TypeFamilies
281   \ TypeFamilyDependencies
282   \ TypeInType
283   \ TypeOperators
284   \ TypeSynonymInstances
285   \ UnboxedSums
286   \ UnboxedTuples
287   \ UndecidableInstances
288   \ UndecidableSuperClasses
289   \ UnicodeSyntax
290   \ UnliftedDatatypes
291   \ UnliftedFFITypes
292   \ UnliftedNewtypes
293   \ ViewPatterns
294   \ XmlSyntax
295   \ NoAllowAmbiguousTypes
296   \ NoApplicativeDo
297   \ NoArrows
298   \ NoAutoDeriveTypeable
299   \ NoBangPatterns
300   \ NoBinaryLiterals
301   \ NoBlockArguments
302   \ NoCApiFFI
303   \ NoCPP
304   \ NoCUSKs
305   \ NoConstrainedClassMethods
306   \ NoConstraintKinds
307   \ NoDataKinds
308   \ NoDatatypeContexts
309   \ NoDefaultSignatures
310   \ NoDeepSubsumption
311   \ NoDeriveAnyClass
312   \ NoDeriveDataTypeable
313   \ NoDeriveFoldable
314   \ NoDeriveFunctor
315   \ NoDeriveGeneric
316   \ NoDeriveLift
317   \ NoDeriveTraversable
318   \ NoDerivingStrategies
319   \ NoDerivingVia
320   \ NoDisambiguateRecordFields
321   \ NoDoAndIfThenElse
322   \ NoDoRec
323   \ NoDuplicateRecordFields
324   \ NoEmptyCase
325   \ NoEmptyDataDecls
326   \ NoEmptyDataDeriving
327   \ NoExistentialQuantification
328   \ NoExplicitForAll
329   \ NoExplicitNamespaces
330   \ NoExtendedDefaultRules
331   \ NoExtendedLiterals
332   \ NoExtensibleRecords
333   \ NoFieldSelectors
334   \ NoFlexibleContexts
335   \ NoFlexibleInstances
336   \ NoForeignFunctionInterface
337   \ NoFunctionalDependencies
338   \ NoGADTSyntax
339   \ NoGADTs
340   \ NoGHCForeignImportPrim
341   \ NoGeneralisedNewtypeDeriving
342   \ NoGeneralizedNewtypeDeriving
343   \ NoGenerics
344   \ NoHereDocuments
345   \ NoHexFloatLiterals
346   \ NoImplicitParams
347   \ NoImplicitPrelude
348   \ NoImportQualifiedPost
349   \ NoImpredicativeTypes
350   \ NoIncoherentInstances
351   \ NoInstanceSigs
352   \ NoInterruptibleFFI
353   \ NoJavaScriptFFI
354   \ NoKindSignatures
355   \ NoLambdaCase
356   \ NoLexicalNegation
357   \ NoLiberalTypeSynonyms
358   \ NoLinearTypes
359   \ NoRequiredTypeArguments
360   \ NoMagicHash
361   \ NoMonadComprehensions
362   \ NoMonadFailDesugaring
363   \ NoMonoLocalBinds
364   \ NoMonoPatBinds
365   \ NoMonomorphismRestriction
366   \ NoMultilineStrings
367   \ NoMultiParamTypeClasses
368   \ NoMultiWayIf
369   \ NoNPlusKPatterns
370   \ NoNamedDefaults
371   \ NoNamedFieldPuns
372   \ NoNamedWildCards
373   \ NoNegativeLiterals
374   \ NoNewQualifiedOperators
375   \ NoNondecreasingIndentation
376   \ NoNullaryTypeClasses
377   \ NoNumDecimals
378   \ NoNumericUnderscores
379   \ NoOverlappingInstances
380   \ NoOverloadedLabels
381   \ NoOverloadedLists
382   \ NoOverloadedRecordDot
383   \ NoOverloadedStrings
384   \ NoOrPatterns
385   \ NoPackageImports
386   \ NoParallelArrays
387   \ NoParallelListComp
388   \ NoPartialTypeSignatures
389   \ NoPatternGuards
390   \ NoPatternSignatures
391   \ NoPatternSynonyms
392   \ NoPolyKinds
393   \ NoPolymorphicComponents
394   \ NoPostfixOperators
395   \ NoQualifiedDo
396   \ NoQuantifiedConstraints
397   \ NoQuasiQuotes
398   \ NoRank2Types
399   \ NoRankNTypes
400   \ NoRebindableSyntax
401   \ NoRecordPuns
402   \ NoRecordWildCards
403   \ NoRecursiveDo
404   \ NoRegularPatterns
405   \ NoRelaxedPolyRec
406   \ NoRestrictedTypeSynonyms
407   \ NoRoleAnnotations
408   \ NoSafeImports
409   \ NoScopedTypeVariables
410   \ NoStandaloneDeriving
411   \ NoStandaloneKindSignatures
412   \ NoStarIsType
413   \ NoStaticPointers
414   \ NoStrict
415   \ NoStrictData
416   \ NoTemplateHaskell
417   \ NoTemplateHaskellQuotes
418   \ NoTraditionalRecordSyntax
419   \ NoTransformListComp
420   \ NoTupleSections
421   \ NoTypeAbstractions
422   \ NoTypeApplications
423   \ NoTypeData
424   \ NoTypeFamilies
425   \ NoTypeFamilyDependencies
426   \ NoTypeInType
427   \ NoTypeOperators
428   \ NoTypeSynonymInstances
429   \ NoUnboxedSums
430   \ NoUnboxedTuples
431   \ NoUndecidableInstances
432   \ NoUndecidableSuperClasses
433   \ NoUnicodeSyntax
434   \ NoUnliftedDatatypes
435   \ NoUnliftedFFITypes
436   \ NoUnliftedNewtypes
437   \ NoViewPatterns
438   \ NoXmlSyntax
440 " Cabal format is (mostly) case-insensitive
441 syn case ignore
443 " Structure regions
444 """""""""""""""""""
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\)[^:]*$/
459 " Unindented fields
460 syn match cabalFieldRegion
461   \ /^[a-zA-Z0-9-]\+\s*:.*\n\(\s\+.*\n\|\s*\n\)*/
463 " Indented fields
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\)*/
471 " Component stanzas
472 """""""""""""""""""
474 syn match cabalCategoryTitle
475   \ contained
476   \ /\c[a-z0-9-]\+/
478 syn keyword cabalCategory
479   \ contained containedin=cabalStanzaLineRegion
480   \ nextgroup=cabalCategoryTitle skipwhite
481   \ flag common source-repository library executable test-suite benchmark foreign-library
483 " Version ranges
484 """"""""""""""""
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
493   \ keepend
494   \ /\%(==\|\^\?>=\|<=\|<\|>\)\s*\d\+\%(\.\d\+\)*\%(\.\*\)\?\>/
496 " Compilers
497 """""""""""
499 syn keyword cabalCompiler contained ghc nhc yhc hugs hbc helium jhc lhc
501 " Conditionals
502 """"""""""""""
504 syn keyword cabalConditional contained containedin=cabalConditionalRegion
505   \ if elif else
507 syn keyword cabalFunction contained
508   \ os arch impl flag
510 syn region cabalFunctionRegion start=+\(os\|arch\|impl\|flag\)\s*(+ end=+)+
511   \ contained containedin=cabalConditionalRegion
512   \ contains=cabalOs,cabalFunction,cabalCompiler,cabalVersionRegion
514 " Common stanzas
515 """"""""""""""""
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\)*/
523 " Fields names
524 """"""""""""""
526 syn match cabalFieldNameRegion contained containedin=cabalFieldRegion
527   \ contains=cabalFieldName
528   \ /^\s*[a-zA-Z0-9-]\+\s*:/
530 syn match cabalColon contained containedin=cabalFieldNameRegion
531   \ /:/
533 " Field Values
534 """""""""""""""""""""""""""""""""
536 syn keyword cabalBoolean contained containedin=cabalFieldRegion
537   \ true false
539 " cabal-version
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\)*/
547 " version
548 syn match cabalPkgVersionRegion
549   \ contained containedin=cabalFieldRegion
550   \ contains=cabalFieldNameRegion,cabalVersion
551   \ /\c^version\s*:.*\n\(\s\+.*\n\|\s*\n\)*/
553 " description
554 syn match cabalDescriptionNameRegion
555   \ contained
556   \ contains=cabalFieldName
557   \ /\c^description/
558 syn match cabalDescriptionRegion
559   \ contained containedin=cabalFieldRegion
560   \ contains=cabalDescriptionNameRegion
561   \ /\c^description\s*:.*\n\(\s\+.*\n\|\s*\n\)*/
563 " tested-with
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\)*/
577 " build-type
578 syn match cabalBuildTypeRegion
579   \ contained containedin=cabalFieldRegion
580   \ contains=cabalFieldNameRegion,cabalBuildType
581   \ /\c^build-type\s*:.*\n\(\s\+.*\n\|\s*\n\)*/
583 " type
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"
639 " vim: ts=2