summaryrefslogtreecommitdiffstats
path: root/syntax/cabal.vim
diff options
context:
space:
mode:
Diffstat (limited to 'syntax/cabal.vim')
-rw-r--r--syntax/cabal.vim147
1 files changed, 147 insertions, 0 deletions
diff --git a/syntax/cabal.vim b/syntax/cabal.vim
new file mode 100644
index 00000000..d0510097
--- /dev/null
+++ b/syntax/cabal.vim
@@ -0,0 +1,147 @@
+" Vim syntax file
+" Language: Cabal
+" Author: Tristan Ravitch
+" Version: 0.0.1
+
+if version < 600
+ syntax clear
+elseif exists('b:current_syntax')
+ finish
+endif
+
+syn sync minlines=50 maxlines=200
+syn case ignore
+
+" Top-level package keywords
+syn match cabalKey '^name:'
+syn match cabalKey '^version:'
+syn match cabalKey '^cabal-version:'
+syn match cabalKey '^build-type:'
+syn match cabalKey '^license:'
+syn match cabalKey '^license-file:'
+syn match cabalKey '^copyright:'
+syn match cabalKey '^author:'
+syn match cabalKey '^maintainer:'
+syn match cabalKey '^stability:'
+syn match cabalKey '^homepage:'
+syn match cabalKey '^bug-reports:'
+syn match cabalKey '^package-url:'
+syn match cabalKey '^synopsis:'
+syn match cabalKey '^description:'
+syn match cabalKey '^category:'
+syn match cabalKey '^tested-with:'
+syn match cabalKey '^data-files:'
+syn match cabalKey '^data-dir:'
+syn match cabalKey '^extra-source-files:'
+syn match cabalKey '^extra-tmp-files:'
+
+" Other keywords
+syn match cabalLit '\(:\s*\)\@<=\(true\|false\)'
+
+" Library-specifics
+syn region cabalLibraryR start='^library\(\s\|$\)\@=' end='^\w' transparent keepend contains=cabalLibrayKey,cabalBuildKey,cabalCondition,cabalOperator
+syn match cabalLibraryKey '^library\(\s\|$\)\@='
+syn match cabalLibraryKey '\(^\s\+\)\@<=exposed-modules:'
+syn match cabalLibraryKey '\(^\s\+\)\@<=exposed:'
+
+" Executable-specifics
+syn region cabalExeR start='^executable\s\@=' end='^\w' transparent keepend contains=cabalExeKey,cabalBuildKey,cabalCondition,cabalOperator,cabalBuildableName
+syn match cabalExeKey '^executable\s\@='
+syn match cabalExeKey '\(^\s\+\)\@<=main-is:'
+
+" Test-specifics
+syn region cabalTestR start='^test-suite\s\@=' end='^\w' transparent keepend contains=cabalTestKey,cabalBuildKey,cabalCondition,cabalOperator,cabalBuildableName
+syn match cabalTestKey '^test-suite\s\@='
+syn match cabalTestKey '\(^\s\+\)\@<=type:'
+syn match cabalTestKey '\(^\s\+\)\@<=main-is:'
+syn match cabalTestKey '\(^\s\+\)\@<=test-module:'
+
+" Benchmark-specifics
+syn region cabalBenchR start='^benchmark\s\@=' end='^\w' transparent keepend contains=cabalBenchKey,cabalBuildKey,cabalCondition,cabalOperator,cabalBuildableName
+syn match cabalBenchKey '^benchmark\s\@='
+syn match cabalBenchKey '\(^\s\+\)\@<=type:'
+syn match cabalBenchKey '\(^\s\+\)\@<=main-is:'
+
+syn match cabalBuildableName '\(^\(^benchmark\|test-suite\|executable\)\s\+\)\@<=\w\+'
+
+" General build info
+syn match cabalBuildKey '\(^\s\+\)\@<=default-language:'
+syn match cabalBuildKey '\(^\s\+\)\@<=build-depends:'
+syn match cabalBuildKey '\(^\s\+\)\@<=other-modules:'
+syn match cabalBuildKey '\(^\s\+\)\@<=hs-source-dirs:'
+syn match cabalBuildKey '\(^\s\+\)\@<=extensions:'
+syn match cabalBuildKey '\(^\s\+\)\@<=build-tools:'
+syn match cabalBuildKey '\(^\s\+\)\@<=buildable:'
+syn match cabalBuildKey '\(^\s\+\)\@<=ghc-options:'
+syn match cabalBuildKey '\(^\s\+\)\@<=ghc-prof-options:'
+syn match cabalBuildKey '\(^\s\+\)\@<=ghc-shared-options:'
+syn match cabalBuildKey '\(^\s\+\)\@<=hugs-options:'
+syn match cabalBuildKey '\(^\s\+\)\@<=nch98-options:'
+syn match cabalBuildKey '\(^\s\+\)\@<=includes:'
+syn match cabalBuildKey '\(^\s\+\)\@<=install-includes:'
+syn match cabalBuildKey '\(^\s\+\)\@<=include-dirs:'
+syn match cabalBuildKey '\(^\s\+\)\@<=c-sources:'
+syn match cabalBuildKey '\(^\s\+\)\@<=extra-libraries:'
+syn match cabalBuildKey '\(^\s\+\)\@<=extra-lib-dirs:'
+syn match cabalBuildKey '\(^\s\+\)\@<=cc-options:'
+syn match cabalBuildKey '\(^\s\+\)\@<=cpp-options:'
+syn match cabalBuildKey '\(^\s\+\)\@<=ld-options:'
+syn match cabalBuildKey '\(^\s\+\)\@<=pkgconfig-depends:'
+syn match cabalBuildKey '\(^\s\+\)\@<=frameworks:'
+
+syn region cabalFlagR start='^flag\s\@=' end='^\w' transparent keepend contains=cabalFlagKey,cabalCondition,cabalFlag
+syn match cabalFlagKey '^flag\s\@='
+syn match cabalFlagKey '\(^\s\+\)\@<=description:'
+syn match cabalFlagKey '\(^\s\+\)\@<=default:'
+syn match cabalFlagKey '\(^\s\+\)\@<=manual:'
+syn match cabalFlag '\(flag\s\+\)\@<=\w\+'
+syn match cabalFlag '\(flag(\)\@<=\w\+)\@='
+
+syn region cabalSourceR start='^source-repository' end='^\w' transparent keepend contains=cabalSourceKey
+syn match cabalSourceKey '^source-repository\s\@='
+syn match cabalSourceKey '\(^\s\+\)\@<=type:'
+syn match cabalSourceKey '\(^\s\+\)\@<=location:'
+syn match cabalSourceKey '\(^\s\+\)\@<=module:'
+syn match cabalSourceKey '\(^\s\+\)\@<=branch:'
+syn match cabalSourceKey '\(^\s\+\)\@<=tag:'
+syn match cabalSourceKey '\(^\s\+\)\@<=subdir:'
+
+syn match cabalCondition '\(^\s\+\)\@<=if\((\|\s\)\@='
+syn match cabalCondition '\(^\s\+\)\@<=else\($\|\s\)\@='
+syn match cabalCondition '\(^\s\+\)\@<=if\((\|\s\)\@='
+syn match cabalCondition '\(^\s\+\)\@<=else\($\|\s\)\@='
+syn match cabalOperator '\W\@<=os\((.\+)\)\@='
+syn match cabalOperator '\W\@<=arch\((.\+)\)\@='
+syn match cabalOperator '\W\@<=impl\((.\+)\)\@='
+syn match cabalOperator '\W\@<=flag\((.\+)\)\@='
+syn match cabalOperator '\(^\s*--.*\)\@<!\(<\|>\|=\|||\|&&\)'
+
+syn match cabalComment '\s\@<=--.*$'
+
+if version >= 508 || !exists('did_cabal_syntax_inits')
+ if version < 508
+ let did_cabal_syntax_inits = 1
+ command -nargs=+ HiLink hi link <args>
+ else
+ command -nargs=+ HiLink hi def link <args>
+ endif
+
+ HiLink cabalBuildableName Structure
+ HiLink cabalFlag Special
+ HiLink cabalComment Comment
+ HiLink cabalCondition Conditional
+ HiLink cabalSourceKey Keyword
+ HiLink cabalOperator Operator
+ HiLink cabalKey Keyword
+ HiLink cabalLibraryKey Keyword
+ HiLink cabalTestKey Keyword
+ HiLink cabalExeKey Keyword
+ HiLink cabalBenchKey Keyword
+ HiLink cabalBuildKey Keyword
+ HiLink cabalFlagKey Keyword
+ HiLink cabalLit Constant
+
+ delcommand HiLink
+endif
+
+let b:current_syntax = 'cabal'