summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdam Stankiewicz <sheerun@sher.pl>2015-07-18 23:22:55 +0200
committerAdam Stankiewicz <sheerun@sher.pl>2015-07-18 23:22:55 +0200
commitcf1e53bc39c96b9f5586a68efa118a13c615da13 (patch)
treeeb6c96a71098df7fc2a38df4606f32a3bfcc925e
parent92ab75408df8bff49bb29e113b3cc159d1ac3105 (diff)
downloadvim-polyglot-cf1e53bc39c96b9f5586a68efa118a13c615da13.tar.gz
vim-polyglot-cf1e53bc39c96b9f5586a68efa118a13c615da13.zip
Changed haskell provider to raichoo/haskell-vim, closes #63
-rw-r--r--README.md2
-rw-r--r--after/ftplugin/cabal.vim8
-rw-r--r--after/ftplugin/haskell.vim12
-rwxr-xr-xbuild2
-rw-r--r--ftdetect/polyglot.vim4
-rw-r--r--ftplugin/cabal.vim69
-rw-r--r--ftplugin/haskell.vim25
-rw-r--r--indent/cabal.vim35
-rw-r--r--indent/haskell.vim348
-rw-r--r--syntax/cabal.vim188
-rw-r--r--syntax/haskell.vim396
11 files changed, 552 insertions, 537 deletions
diff --git a/README.md b/README.md
index d5cc0fdc..2ed46103 100644
--- a/README.md
+++ b/README.md
@@ -43,7 +43,7 @@ Optionally download one of the [releases](https://github.com/sheerun/vim-polyglo
- [go](https://github.com/fatih/vim-go) (syntax, indent, ftdetect)
- [haml](https://github.com/tpope/vim-haml) (syntax, indent, compiler, ftplugin, ftdetect)
- [handlebars](https://github.com/mustache/vim-mustache-handlebars) (syntax, ftplugin, ftdetect)
-- [haskell](https://github.com/travitch/hasksyn) (syntax, indent, ftplugin)
+- [haskell](https://github.com/raichoo/haskell-vim) (syntax, indent, ftplugin, ftdetect)
- [haxe](https://github.com/yaymukund/vim-haxe) (syntax, ftdetect)
- [html5](https://github.com/othree/html5.vim) (syntax, indent, autoload, ftplugin)
- [jade](https://github.com/digitaltoad/vim-jade) (syntax, indent, ftplugin, ftdetect)
diff --git a/after/ftplugin/cabal.vim b/after/ftplugin/cabal.vim
new file mode 100644
index 00000000..a4f042ba
--- /dev/null
+++ b/after/ftplugin/cabal.vim
@@ -0,0 +1,8 @@
+if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'haskell') == -1
+
+setlocal comments=s1fl:{-,mb:-,ex:-},:--
+setlocal formatoptions-=cro formatoptions+=j
+setlocal iskeyword+=-,.,*
+setlocal commentstring=--\ %s
+
+endif
diff --git a/after/ftplugin/haskell.vim b/after/ftplugin/haskell.vim
index 4b315458..387ffe71 100644
--- a/after/ftplugin/haskell.vim
+++ b/after/ftplugin/haskell.vim
@@ -1,13 +1,7 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'haskell') == -1
-" Vim ftplugin file
-" Language: Haskell
-" Maintainer: Tristan Ravitch
-
-" I don't fully understand what the vim-default ftplugin does, but I do know
-" that the three-part comment entry really messes up this indenter (I also
-" hate the leading '-'s it puts in on each line). Disable it here.
-setlocal comments&
-setlocal comments=:--
+setlocal comments=s1fl:{-,mb:-,ex:-},:--
+setlocal formatoptions-=cro formatoptions+=j
+setlocal iskeyword+='
endif
diff --git a/build b/build
index 9b7c24b6..9b361d4a 100755
--- a/build
+++ b/build
@@ -114,7 +114,7 @@ PACKS="
go:fatih/vim-go:_BASIC
haml:tpope/vim-haml
handlebars:mustache/vim-mustache-handlebars
- haskell:travitch/hasksyn
+ haskell:raichoo/haskell-vim
haxe:yaymukund/vim-haxe
html5:othree/html5.vim
jade:digitaltoad/vim-jade
diff --git a/ftdetect/polyglot.vim b/ftdetect/polyglot.vim
index 73860ae7..60307e7d 100644
--- a/ftdetect/polyglot.vim
+++ b/ftdetect/polyglot.vim
@@ -110,6 +110,10 @@ autocmd BufNewFile,BufRead *.haml,*.hamlbars,*.hamlc setf haml
autocmd BufNewFile,BufRead *.sass setf sass
autocmd BufNewFile,BufRead *.scss setf scss
endif
+if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'haskell') == -1
+
+au BufRead,BufNewFile *.hsc set filetype=haskell
+endif
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'haxe') == -1
autocmd BufNewFile,BufRead *.hx setf haxe
diff --git a/ftplugin/cabal.vim b/ftplugin/cabal.vim
new file mode 100644
index 00000000..0942397c
--- /dev/null
+++ b/ftplugin/cabal.vim
@@ -0,0 +1,69 @@
+if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'haskell') == -1
+
+if exists("g:loaded_haskellvim_cabal")
+ finish
+endif
+
+let g:loaded_haskellvim_cabal = 1
+
+function! s:makeSection(content)
+ return "\n" . join(a:content, "\n")
+endfunction
+
+function! s:exeTmpl(name, src)
+ let l:exetmpl = [ 'executable ' . a:name,
+ \ '-- ghc-options:',
+ \ 'main-is: ' . a:src,
+ \ '-- other-modules:',
+ \ '-- other-extensions:',
+ \ 'build-depends: base',
+ \ '-- hs-source-dirs:',
+ \ 'default-language: Haskell2010'
+ \ ]
+
+ return s:makeSection(l:exetmpl)
+endfunction
+
+function! s:libTmpl()
+ let l:libtmpl = [ 'library',
+ \ '-- ghc-options:',
+ \ '-- other-modules:',
+ \ '-- other-extensions:',
+ \ 'build-depends: base',
+ \ '-- hs-source-dirs:',
+ \ 'default-language: Haskell2010'
+ \ ]
+
+ return s:makeSection(l:libtmpl)
+endfunction
+
+function! s:flagTmpl(name)
+ let l:flagtmpl = [ 'flag ' . a:name,
+ \ 'description:',
+ \ 'default: False',
+ \ 'manual: True',
+ \ ]
+
+ return s:makeSection(l:flagtmpl)
+endfunction
+
+function! cabal#addExecutable()
+ let l:name = input("Enter executable name: ")
+ let l:src = input("Enter source file: ")
+ exe "normal Go" . s:exeTmpl(l:name, l:src)
+endfunction
+
+function! cabal#addLibrary()
+ exe "normal Go" . s:libTmpl()
+endfunction
+
+function! cabal#addFlag()
+ let l:name = input("Enter flag name: ")
+ exe "normal Go" . s:flagTmpl(l:name)
+endfunction
+
+command! -buffer CabalAddExecutable call cabal#addExecutable()
+command! -buffer CabalAddLibrary call cabal#addLibrary()
+command! -buffer CabalAddFlag call cabal#addFlag()
+
+endif
diff --git a/ftplugin/haskell.vim b/ftplugin/haskell.vim
new file mode 100644
index 00000000..3e9c43f8
--- /dev/null
+++ b/ftplugin/haskell.vim
@@ -0,0 +1,25 @@
+if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'haskell') == -1
+
+if exists("g:loaded_haskellvim_haskell")
+ finish
+endif
+
+let g:loaded_haskellvim_haskell = 1
+
+function! haskell#makeModuleCommentBlock()
+ let l:commenttmpl = [ '{-|',
+ \ 'Module : ',
+ \ 'Description : ',
+ \ 'Copyright : ',
+ \ 'License : ',
+ \ 'Maintainer : ',
+ \ 'Stability : ',
+ \ 'Portability : ',
+ \ '-}']
+
+ exe "normal ggO" . join(l:commenttmpl, "\n")
+endfunction
+
+command! -buffer -nargs=0 HaskellAddModuleComment call haskell#makeModuleCommentBlock()
+
+endif
diff --git a/indent/cabal.vim b/indent/cabal.vim
new file mode 100644
index 00000000..b2089a5e
--- /dev/null
+++ b/indent/cabal.vim
@@ -0,0 +1,35 @@
+if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'haskell') == -1
+
+" indentation for cabal
+"
+" author: raichoo (raichoo@googlemail.com)
+"
+if exists('b:did_indent')
+ finish
+endif
+
+let b:did_indent = 1
+
+if !exists('g:cabal_indent_section')
+ "executable name
+ ">>main-is: Main.hs
+ ">>hs-source-dirs: src
+ let g:cabal_indent_section = 2
+elseif exists('g:cabal_indent_section') && g:cabal_indent_section > 4
+ let g:cabal_indent_section = 4
+endif
+
+setlocal indentexpr=GetCabalIndent()
+setlocal indentkeys=!^F,o,O,<CR>
+
+function! GetCabalIndent()
+ let l:prevline = getline(v:lnum - 1)
+
+ if l:prevline =~ '\C^\(executable\|library\|flag\|source-repository\|test-suite\|benchmark\)'
+ return g:cabal_indent_section
+ else
+ return match(l:prevline, '\S')
+ endif
+endfunction
+
+endif
diff --git a/indent/haskell.vim b/indent/haskell.vim
index 6a16e735..8af1aedd 100644
--- a/indent/haskell.vim
+++ b/indent/haskell.vim
@@ -1,8 +1,15 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'haskell') == -1
-" Vim indent file
-" Language: Haskell
-" Maintainer: Tristan Ravitch
+" indentation for haskell
+"
+" Based on idris indentation
+"
+" author: raichoo (raichoo@googlemail.com)
+"
+" Modify g:haskell_indent_if and g:haskell_indent_case to
+" change indentation for `if'(default 3) and `case'(default 5).
+" Example (in .vimrc):
+" > let g:haskell_indent_if = 2
if exists('b:did_indent')
finish
@@ -10,291 +17,164 @@ endif
let b:did_indent = 1
-if !exists('g:hasksyn_indent_search_backward')
- let g:hasksyn_indent_search_backward = 100
+if !exists('g:haskell_indent_if')
+ " if bool
+ " >>>then ...
+ " >>>else ...
+ let g:haskell_indent_if = 3
endif
-if !exists('g:hasksyn_dedent_after_return')
- let g:hasksyn_dedent_after_return = 1
+if !exists('g:haskell_indent_case')
+ " case xs of
+ " >>[] -> ...
+ " >>(y:ys) -> ...
+ let g:haskell_indent_case = 2
endif
-if !exists('g:hasksyn_dedent_after_catchall_case')
- let g:hasksyn_dedent_after_catchall_case = 1
+if !exists('g:haskell_indent_let')
+ " let x = 0 in
+ " >>>>x
+ let g:haskell_indent_let = 4
endif
-setlocal noautoindent
-setlocal indentexpr=HIndent(v:lnum)
-setlocal indentkeys+=0=where
-setlocal indentkeys+=0=->
-setlocal indentkeys+=0==>
-setlocal indentkeys+=0=in
-setlocal indentkeys+=0=class,0=instance,0=import
-setlocal indentkeys+=<Bar>
-setlocal indentkeys+=0\,
-
-if exists("*HIndent")
- finish
+if !exists('g:haskell_indent_where')
+ " where f :: Int -> Int
+ " >>>>>>f x = x
+ let g:haskell_indent_where = 6
endif
+if !exists('g:haskell_indent_do')
+ " do x <- a
+ " >>>y <- b
+ let g:haskell_indent_do = 3
+endif
-function! HIndent(lnum)
- " Don't do anything boneheaded if we are inside of a block comment
- if s:IsInBlockComment()
- return -1
- endif
+if !exists('g:haskell_indent_in')
+ " let x = 1
+ " >in x
+ let g:haskell_indent_in = 1
+endif
- let plnum = s:PrevNonCommentLineNum(a:lnum)
- if plnum == 0
- return 0
- endif
+setlocal indentexpr=GetHaskellIndent()
+setlocal indentkeys=!^F,o,O,0\|,0=where,0=in,0=let,0=deriving,0=->,0=\=>,<CR>,0}
- let prevl = s:GetAndStripTrailingComments(plnum)
- let thisl = s:GetAndStripTrailingComments(a:lnum)
- let previ = indent(plnum)
-
- " If this is a bare where clause, indent it one step. where as part of an
- " instance should be unaffected unless you put it in an odd place.
- " This is the wrong thing if you are deeply indented already and want to put
- " a where clause on the top-level construct, but there isn't much that can
- " be done about that case...
- if thisl =~ '^\s*where\s*'
- return previ + &sw
- endif
+function! GetHaskellIndent()
+ let l:prevline = getline(v:lnum - 1)
- " If we start a new line for a type signature, see if we can line it up with
- " the previous line.
- if thisl =~ '^\s*\(->\|=>\)\s*'
- let tokPos = s:BackwardPatternSearch(a:lnum, '\(::\|->\|=>\)')
- if tokPos != -1
- return tokPos
- endif
+ if l:prevline =~ '^\s*--'
+ return match(l:prevline, '\S')
endif
- if prevl =~ '\Wof\s*$' || prevl =~ '\Wm\=do\s*$'
- return previ + &sw
+ if l:prevline =~ '^\s*$'
+ return 0
endif
- " Now for commas. Commas will align pretty naturally for simple pattern
- " guards, so don't worry about that for now. If we see the line is just a
- " comma, search up for something to align it to. In the easy case, look
- " for a [ or { (the last in their line). Also consider other commas that
- " are preceeded only by whitespace. This isn't just a previous line check
- " necessarily, though that would cover most cases.
- if thisl =~ '^\s*,'
- let cmatch = match(prevl, '\(^\s*\)\@<=,')
- if cmatch != -1
- return cmatch
- endif
+ let l:line = getline(v:lnum)
- let bmatch = match(prevl, '\({\|\[\)')
- if bmatch != -1
- return bmatch
- endif
+ if l:line =~ '\C^\s*\<where\>'
+ let l:s = match(l:prevline, '\S')
+ return l:s + &shiftwidth
endif
- " Match an 'in' keyword with the corresponding let. Unfortunately, if the
- " name of your next binding happens to start with 'in', this will muck with
- " it. Not sure if there is a workaround because we can't force an
- " auto-indent after 'in ' as far as I can see.
- if thisl =~ '\s*in$'
- let letStart = s:BackwardPatternSearch(a:lnum, '\(\W\)\@<=let\W')
- if letStart != -1
- return letStart
+ if l:line =~ '\C^\s*\<deriving\>'
+ let l:s = match(l:prevline, '\C\<\(newtype\|data\)\>')
+ if l:s >= 0
+ return l:s + &shiftwidth
endif
endif
- " We don't send data or type to column zero because they can be indented
- " inside of 'class' definitions for data/type families
- if thisl =~ '^\s*\(class\|instance\|newtype\|import\)'
- return 0
- endif
-
- " FIXME: Only do this if the previous line was not already indented for the
- " same reason. Also be careful of -> in type signatures. Make sure we have
- " an earlier rule to line those up properly.
- if prevl =~ '[=>\$\.\^+\&`(-]\s*$'
- return previ + &sw
+ if l:line =~ '\C^\s*\<let\>'
+ let l:s = match(l:prevline, '\C\<let\>')
+ if l:s != 0
+ return l:s
+ endif
endif
- " We have a special case for dealing with trailing '*' operators. If the *
- " is the end of a kind signature in a type family/associated type, we don't
- " want to indent the next line. We do if it is just being a * operator in
- " an expression, though.
- if prevl =~ '\(\(type\|data\).*\)\@<!\*\s*$'
- return previ + &sw
+ if l:line =~ '\C^\s*\<in\>'
+ let l:s = match(l:prevline, '\C\<let\>')
+ if l:s >= 0
+ return l:s + g:haskell_indent_in
+ elseif match(l:prevline, '=') > 0
+ let l:s = match(l:prevline, '\S')
+ return l:s - (4 - g:haskell_indent_in)
+ endif
endif
- " If the previous line ends in a where, indent us a step
- if prevl =~ '\Wwhere\s*$'
- return previ + &sw
+ if l:line =~ '^\s*|'
+ if match(l:prevline, '^\s*data') < 0
+ if match(l:prevline, '^\s*|\s') >= 0
+ return match(l:prevline, '|')
+ else
+ return &shiftwidth
+ endif
+ endif
endif
- " If we see a |, first try to line it up with the pipe on the previous line.
- " Search backward on nearby lines, giving up if we hit a line with a \w at
- " column 0. Otherwise, indent it relative to the previous line
- "
- " Here we can also handle the case of lining up data declarations. The
- " backwards pipe search will fail for a data declaration (since data is at
- " column 0), so we can have an extra check after the pipe search for
- " data..=.
- if thisl =~ '^\s*|$'
- let nearestPipeIndex = s:BackwardPatternSearch(a:lnum, '\(^\s*\)\@<=|')
- if nearestPipeIndex != -1
- return nearestPipeIndex
+ if l:line =~ '^\s*[=-]>'
+ let l:s = match(l:prevline, ' :: ')
+ if l:s >= 0
+ return l:s + 1
endif
+ endif
- let dataEquals = match(prevl, '\(data.*\)\@<==')
- if dataEquals != -1
- return dataEquals
+ if l:prevline =~ '\s\+[!#$%&*+./<>?@\\^|~-]\+\s*$'
+ let l:s = match(l:prevline, '\S')
+ if l:s > 0
+ return l:s + &shiftwidth
endif
-
- return previ + &sw
endif
- " If the previous line has a let, line the cursor up with the start of the
- " first binding name. Autoindent handles subsequent cases.
- "
- " This should come after the 'in' aligner so that 'in' is not treated as
- " just something to be aligned to the previous binding.
- let lbindStart = match(prevl, '\(\Wlet\s\+\)\@<=\w')
- if lbindStart != -1
- return lbindStart
+ if l:prevline =~ '[{([][^})\]]\+$'
+ return match(l:prevline, '[{([]')
endif
- " If requested, dedent from a bare return (presumably in a do block).
- " This comes after the trailing operator case - hopefully that will avoid
- " returns on lines by themselves but not really in a do block. This is a
- " heuristic.
- if g:hasksyn_dedent_after_return && prevl =~ '^\s*return\W'
- return previ - &sw
+ if l:prevline =~ '\C\<let\>\s\+[^=]\+=\s*$'
+ return match(l:prevline, '\C\<let\>') + g:haskell_indent_let + &shiftwidth
endif
- " Similar to the return dedent - after a catchall case _ -> ..., we can
- " almost certainly dedent. Again, it comes after the line continuation
- " heuristic so we don't dedent while someone is making an obviously
- " multi-line construct
- if g:hasksyn_dedent_after_catchall_case && prevl =~ '^\s*_\s*->\W'
- return previ - &sw
+ if l:prevline =~ '\C\<let\>\s\+.\+\(\<in\>\)\?\s*$'
+ return match(l:prevline, '\C\<let\>') + g:haskell_indent_let
endif
- " On the other hand, if the previous line is a do or where with some bindings
- " following it on the same line, accommodate and align with the first non-ws
- " char after the where
- if prevl =~ '\W\(do\|where\)\s\+\w'
- let bindStart = match(prevl, '\(\W\(do\|where\)\s\+\)\@<=\w')
- if bindStart != -1
- return bindStart
+ if l:prevline !~ '\C\<else\>'
+ let l:s = match(l:prevline, '\C\<if\>.*\&.*\zs\<then\>')
+ if l:s > 0
+ return l:s
endif
- return previ + &sw
+ let l:s = match(l:prevline, '\C\<if\>')
+ if l:s > 0
+ return l:s + g:haskell_indent_if
+ endif
endif
- return previ
-endfunction
-
-" Search backwards for a token from the cursor position
-function! s:FindTokenNotInCommentOrString(tok)
- return search('\(--.*\|"\([^"]\|\\"\)*\)\@<!' . tok, 'bcnW')
-endfunction
-
-" Should return -1 if the given line is inside of an unclosed block comment.
-" This is meant to let us exit early from the indenter if we are in a comment.
-" Look for the nearest -} and {- such that they are not between "" or in a
-" line comment
-"
-" Note: we may need to restrict how far back this will search. On the other
-" hand, the native vim 'search' function might be efficient enough to support
-" entire buffers.
-function! s:IsInBlockComment()
- let openCommPos = s:FindTokenNotInCommentOrString('{-')
- " If there is no open comment, then we don't have to look for a close
- if openCommPos == 0
- return 0
+ if l:prevline =~ '\C\(\<where\>\|\<do\>\|=\|[{([]\)\s*$'
+ return match(l:prevline, '\S') + &shiftwidth
endif
- " Or if there is a close comment marker that comes after the open marker, we
- " are not in a comment. Note that we potentially need to check the position
- " in the line if they are both on the same line. I'll fix it later.
- let closeCommPos = s:FindTokenNotInCommentOrString('-}')
- if closeCommPos >= openCommPos
- return 0
+ if l:prevline =~ '\C\<where\>\s\+\S\+.*$'
+ return match(l:prevline, '\C\<where\>') + g:haskell_indent_where
endif
- return 1
-endfunction
-
-" Get the previous line that is not a comment. Pass in the *current* line
-" number. Also skips blank lines.
-function! s:PrevNonCommentLineNum(lnum)
- if a:lnum <= 1
- return 0
+ if l:prevline =~ '\C\<do\>\s\+\S\+.*$'
+ return match(l:prevline, '\C\<do\>') + g:haskell_indent_do
endif
- let lnum = a:lnum - 1
-
- while 1
- if lnum == 0
- return 0
+ if l:prevline =~ '\C^\s*\<data\>\s\+[^=]\+\s\+=\s\+\S\+.*$'
+ if l:line =~ '^\s*|'
+ return match(l:prevline, '=')
endif
-
- let aline = getline(lnum)
- if aline =~ '^\s*--'
- let lnum = lnum - 1
- else
- return lnum
- endif
- endwhile
-endfunction
-
-function! s:GetAndStripTrailingComments(lnum)
- let aline = getline(a:lnum)
- " We can't just remove the string literal since that leaves us with a
- " trailing operator (=), so replace it with a fake identifier
- let noStrings = substitute(aline, '"\([^"]\|\\"\)*"', '\=repeat("s", len(submatch(0)))', '')
- let noLineCom = substitute(noStrings, '--.*$', '', '')
-
- " If there are no fancy block comments involved, skip some of this extra
- " work
- if noLineCom !~ '\({-\|-}\)'
- return noLineCom
endif
- " We stripped line comments, now we need to strip out any relevant multiline
- " comments. This includes comments starting much earlier but ending on this
- " line or comments starting on this line and continuing to the next. This
- " is probably easiest in two steps: {- to (-}|$) and then ^ to -}.
- " Note we are using a non-greedy match here so that only the minimal {- -}
- " pair is consumed.
- let noBlock1 = substitute(noLineComm, '{-.\{-}-}', '', '')
- let noBlock2 = substitute(noBlock1, '{-.\{-}$', '', '')
- let noBlock3 = substitute(noBlock2, '^.\{-}-}', '', '')
- return noBlock3
-endfunction
+ if l:prevline =~ '\C\<case\>\s\+.\+\<of\>\s*$'
+ return match(l:prevline, '\C\<case\>') + g:haskell_indent_case
+ endif
-" Search backwards from lnum for pat, returning the starting index if found
-" within the search range or -1 if not found. Stops searching at lines
-" starting at column 0 with an identifier character.
-function! s:BackwardPatternSearch(lnum, pat)
- let lnum = s:PrevNonCommentLineNum(a:lnum)
- while 1
- let aline = s:GetAndStripTrailingComments(lnum)
- if a:lnum - lnum > g:hasksyn_indent_search_backward
- return -1
- endif
+ if l:prevline =~ '\C^\s*\<\data\>\s\+\S\+\s*$'
+ return match(l:prevline, '\C\<data\>') + &shiftwidth
+ endif
- let theMatch = match(aline, a:pat)
- if theMatch != -1
- return theMatch
- else
- " We want to be able to consider lines starting in column 0, but we don't
- " want to search back past them.
- if aline =~ '^\w'
- return -1
- endif
- let lnum = s:PrevNonCommentLineNum(lnum)
- endif
- endwhile
+ return match(l:prevline, '\S')
endfunction
-
endif
diff --git a/syntax/cabal.vim b/syntax/cabal.vim
index f0ede997..7a48a638 100644
--- a/syntax/cabal.vim
+++ b/syntax/cabal.vim
@@ -1,151 +1,55 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'haskell') == -1
-" Vim syntax file
-" Language: Cabal
-" Author: Tristan Ravitch
-" Version: 0.0.1
+" syntax highlighting for cabal
+"
+" author: raichoo (raichoo@googlemail.com)
if version < 600
- syntax clear
-elseif exists('b:current_syntax')
+ syn 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 '--.*$' contains=@Spell
-
-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'
+syn match cabalLineComment "---*\([^-!#$%&\*\+./<=>\?@\\^|~].*\)\?$" contains=@Spell
+syn match cabalIdentifier "[A-Za-z\-]*" contained
+syn match cabalOperator "[<=>&|!]"
+syn match cabalColon ":" contained
+syn match cabalNumber "\<[0-9][0-9\.*]*\>"
+syn match cabalDelimiter "[,()]"
+syn keyword cabalBool True False
+syn keyword cabalConditional if else
+syn match cabalCompilerFlag "\s\+-[^ -][^ ]*"
+syn match cabalDocBulletPoint "^\s\+\*"
+syn match cabalDocHeadline "^\s\+=.*$"
+syn match cabalDocCode "^\s\+>.*$"
+syn match cabalDocNewline "^\s\+\.\s*$"
+syn match cabalSection "^\c\(executable\|library\|flag\|source-repository\|test-suite\|benchmark\)"
+syn match cabalEntry "^\s*[A-Za-z][a-zA-Z\-]*:" contains=cabalIdentifier,cabalColon
+
+syn region cabalDescription start="^\s*[dD]escription:" end="^\<" keepend
+ \ contains=
+ \ cabalEntry,
+ \ cabalLineComment,
+ \ cabalDocBulletPoint,
+ \ cabalDocHeadline,
+ \ cabalDocNewline,
+ \ cabalDocCode
+
+highlight def link cabalIdentifier Identifier
+highlight def link cabalLineComment Comment
+highlight def link cabalOperator Operator
+highlight def link cabalColon Operator
+highlight def link cabalNumber Number
+highlight def link cabalSection Structure
+highlight def link cabalDelimiter Delimiter
+highlight def link cabalBool Boolean
+highlight def link cabalCompilerFlag Macro
+highlight def link cabalConditional Conditional
+highlight def link cabalDocBulletPoint Structure
+highlight def link cabalDocHeadline Include
+highlight def link cabalDocNewline Operator
+highlight def link cabalDocCode Macro
+
+let b:current_syntax = "cabal"
endif
diff --git a/syntax/haskell.vim b/syntax/haskell.vim
index b8d91371..2decc05d 100644
--- a/syntax/haskell.vim
+++ b/syntax/haskell.vim
@@ -1,162 +1,258 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'haskell') == -1
-" Vim syntax file
-" Language: Haskell
-" Author: Tristan Ravitch
-" Maintainer: Tristan Ravitch
-" Version: 0.0.1
+" syntax highlighting for haskell
+"
+" Heavily modified version of the haskell syntax
+" highlighter to support haskell.
+"
+" author: raichoo (raichoo@googlemail.com)
if version < 600
- syntax clear
-elseif exists('b:current_syntax')
+ syn clear
+elseif exists("b:current_syntax")
finish
endif
-syn sync minlines=50 maxlines=200
-
-" These basic lexical definitions are taken from the orignal haskell syntax
-" description from vim 7.3.
-syn match hsSpecialChar contained "\\\([0-9]\+\|o[0-7]\+\|x[0-9a-fA-F]\+\|[\"\\'&\\abfnrtv]\|^[A-Z^_\[\\\]]\)"
-syn match hsSpecialChar contained "\\\(NUL\|SOH\|STX\|ETX\|EOT\|ENQ\|ACK\|BEL\|BS\|HT\|LF\|VT\|FF\|CR\|SO\|SI\|DLE\|DC1\|DC2\|DC3\|DC4\|NAK\|SYN\|ETB\|CAN\|EM\|SUB\|ESC\|FS\|GS\|RS\|US\|SP\|DEL\)"
-syn match hsSpecialCharError contained "\\&\|'''\+"
-syn region hsString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=hsSpecialChar
-syn match hsCharacter "[^a-zA-Z0-9_']'\([^\\]\|\\[^']\+\|\\'\)'"lc=1 contains=hsSpecialChar,hsSpecialCharError
-syn match hsCharacter "^'\([^\\]\|\\[^']\+\|\\'\)'" contains=hsSpecialChar,hsSpecialCharError
-syn match hsNumber "\<[0-9]\+\>\|\<0[xX][0-9a-fA-F]\+\>\|\<0[oO][0-7]\+\>"
-syn match hsFloat "\<[0-9]\+\.[0-9]\+\([eE][-+]\=[0-9]\+\)\=\>"
-
-" This case matches the names of types and constructors: names beginning with
-" a capital letter. Note that this also handles the case of @M.lookup@ where
-" M is a qualified import. There is a big negative lookbehind assertion here
-" so that we don't highlight import and module statements oddly.
-syn match hsTypeName "\(^import\s.*\|^module\s.*\)\@<!\(^\|[^a-zA-Z0-9]\)\@<=[A-Z][a-zA-Z0-9_]*"
-" Also make unit and the empty list easy to spot - they are constructors too.
-syn match hsTypeName "()"
-syn match hsTypeName "\[\]"
-
-" These are keywords that are only highlighted if they are in comments.
-syn keyword hsFIXME contained FIXME TODO XXX BUG NOTE
-
-" Comment stuff
-syn region hsPragma start='{-#' end='#-}'
-syn region hsBlockComment start='{-' end='-}' fold contains=hsFIXME,hsBlockComment,@Spell
-" FIXME: haddock block comments should be able to contain hsBlockComments, but
-" it doesn't seem to work at the moment.
-syn region hsHaddockComment start='{-|' end='-}' contains=hsFIXME,@Spell
-syn match hsLineComment "--.*$" contains=hsFIXME,@Spell
-" Line-based haddock comments are trickier - they continue until
-" the next line that isn't part of the same block of comments.
-syn region hsHaddockComment start='-- |' end='^\(\s*--\)\@!' contains=hsFIXME,@Spell
-syn region hsHaddockComment start='-- \$\w\+' end='^\(\s*--\)\@!' contains=hsFIXME,@Spell
-syn region hsHaddockComment start='-- ^' end='^\(\s*--\)\@!' contains=hsFIXME,@Spell
-" Haddock sections for import lists
-syn match hsHaddockSection '-- \*.*$'
-" Named documentation chunks (also for import lists)
-syn match hsHaddockSection '-- \$.*$'
-" Treat a shebang line at the start of the file as a comment
-syn match hsLineComment "\%^\#\!.*$"
-
-
-" Keywords appearing in expressions, plus a few top-level keywords
-syn keyword hsKeyword do mdo let in _ where
-syn keyword hsKeyword infix infixl infixr
-syn keyword hsKeyword forall foreign
-syn match hsKeyword '\(^\(data\|type\)\s\+\)\@<=family\(\W\)\@='
-
-" Vim has a special syntax category for conditionals, so here are all of the
-" haskell conditionals. These are just keywords with a slightly more flexible
-" coloring.
-syn keyword hsConditional case of if then else
-
-" We define a region for module NNNN (...) where so that haddock section
-" headers (-- *) can be highlighted specially only within this context.
-syn region hsModuleHeader start="^module\s" end="where" contains=hsHaddockSection keepend fold transparent
-" Treat Module imports as the #include category; it maps reasonably well
-syn keyword hsImport import module
-" Treat 'qualified', 'as', and 'hiding' as keywords when following 'import'
-syn match hsImport '\(\<import\>.*\)\@<=\<\(qualified\|as\|hiding\)\>'
-
-syn keyword hsTypeDecls class instance data newtype type deriving default
-" FIXME: Maybe we can do something fancy for data/type families? 'family' is
-" only a keyword if it follows data/type...
-
-" We want to let '-' participate in operators, but we can't let it match
-" '--', '---', etc. because it interferes with comments. The same goes for
-" '#!' at the start of a file. Also, the dot (.) is an operator character,
-" but not when it comes immediately after a module name.
-syn match hsOperator "\(\%^\#\!\)\@!\(\(\<[A-Z]\w*\)\@64<=\.\)\@!\(--\+\([^.%\~\&\*/\$\^|@:+<!>=#!\?]\|$\)\)\@![-.%\~\&\*/\$\^|@:+<!>=#!\?]\+"
-" Include support for infix functions as operators
-syn match hsOperator "`[a-zA-Z0-9\.]\+`"
-
-" Highlight function/value names in type signatures. Looks ahead to find a ::
-" after a name. This allows whitespace before the name so that it can match
-" in a 'where,' but it won't match local type annotations on random little
-" things.
-syn match hsFunctionList "^\s*\(\<\(where\>\|let\>\)\@![a-z][a-zA-Z0-9']*[[:space:]\n,]\+\)*[a-z][a-zA-Z0-9']*[[:space:]\n]*::" contains=hsFunction
-syn match hsFunction "\s*[a-z][a-zA-Z0-9']*\([[:space:]\n]*\(::\|,\)\)\@=" contained
-" Also support the style where the first where binding is on the same line as
-" the where keyword.
-syn match hsFunction "\(\<\(where\|let\)\s\+\([a-z][a-zA-Z0-9']*\s*,\s*\)*\)\@<=[a-z][a-zA-Z0-9']*\(\s*\(,\s*[a-z][a-zA-Z0-9']*\s*\)*::\)\@="
-
-" FIXME Ignoring proc for now, also mdo and rec
-
-" Give undefined a bit of special treatment
-syn keyword hsScary undefined
-
-" C Preprocessor stuff
-syn match hsCPP '\(^\s*\)\@<=#\(warning\|pragma\|error\)\W\@='
-syn match hsCPPCond '\(^\s*\)\@<=#\(if\|ifdef\|elif\)\W\@='
-syn match hsCPPCond '\(^\s*\)\@<=#\(endif\|else\)\(\s*$\|\W\)\@='
-syn match hsCPPInclude '\(^\s*\)\@<=#include\W\@='
-syn match hsCPPDefine '\(^\s*\)\@<=#define\W\@='
-syn match hsCPPDefined '\(^\s*.*\W\)\@<=defined(\w\+)'
-
-if version >= 508 || !exists('did_hs_syntax_inits')
- if version < 508
- let did_hs_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- " CPP
- HiLink hsCPP PreProc
- HiLink hsCPPCond PreCondit
- HiLink hsCPPInclude Include
- HiLink hsCPPDefine Define
- HiLink hsCPPDefined PreProc
-
- " Comments
- HiLink hsLineComment Comment
- HiLink hsBlockComment Comment
- HiLink hsPragma Comment
- HiLink hsHaddockComment SpecialComment
- HiLink hsHaddockSection SpecialComment
-
- HiLink hsKeyword Keyword
- HiLink hsConditional Conditional
- HiLink hsImport Include
- HiLink hsTypeDecls Keyword
-
- HiLink hsFIXME Todo
-
- HiLink hsOperator Operator
-
- HiLink hsModuleQualifier StorageClass
-
- HiLink hsFunction Function
- HiLink hsTypeName Type
-
- " Literals
- HiLink hsSpecialChar SpecialChar
- HiLink hsFloat Float
- HiLink hsNumber Number
- HiLink hsCharacter Character
- HiLink hsString String
+if exists('g:haskell_enable_quantification') && g:haskell_enable_quantification == 1
+ syn region haskellRecordBlock matchgroup=haskellDelimiter start="{" end="}"
+ \ contains=
+ \ haskellType,
+ \ haskellSeparator,
+ \ haskellParens,
+ \ haskellBrackets,
+ \ haskellRecordField,
+ \ haskellOperators,
+ \ haskellDot,
+ \ haskellLineComment,
+ \ haskellBlockComment,
+ \ haskellPragma,
+ \ haskellForall
+else
+ syn region haskellRecordBlock matchgroup=haskellDelimiter start="{" end="}"
+ \ contains=
+ \ haskellType,
+ \ haskellSeparator,
+ \ haskellParens,
+ \ haskellBrackets,
+ \ haskellRecordField,
+ \ haskellOperators,
+ \ haskellDot,
+ \ haskellLineComment,
+ \ haskellBlockComment,
+ \ haskellPragma
+endif
+if exists('g:haskell_enable_pattern_synonyms') && g:haskell_enable_pattern_synonyms == 1
+ syn region haskellImportList matchgroup=haskellDelimiter start="(" end=")"
+ \ contains=
+ \ haskellSeparator,
+ \ haskellType,
+ \ haskellLineComment,
+ \ haskellBlockComment,
+ \ haskellDot,
+ \ haskellParens,
+ \ haskellPatternKeyword
+else
+ syn region haskellImportList matchgroup=haskellDelimiter start="(" end=")"
+ \ contains=
+ \ haskellSeparator,
+ \ haskellType,
+ \ haskellLineComment,
+ \ haskellBlockComment,
+ \ haskellDot,
+ \ haskellParens
+end
+syn match haskellRecordField "[_a-z][a-zA-Z0-9_']*\s*::" contained
+ \ contains=
+ \ haskellIdentifier,
+ \ haskellOperators
+syn match haskellTopLevelDecl
+ \ "^\s*\(where\s\+\|let\s\+\|default\s\+\)\?[_a-z][a-zA-Z0-9_']*\(,\s*[_a-z][a-zA-Z0-9_']*\)*\(\s*::\|\n\s\+::\)"
+ \ contains=
+ \ haskellIdentifier,
+ \ haskellOperators,
+ \ haskellSeparator,
+ \ haskellParens,
+ \ haskellBrackets,
+ \ haskellWhere,
+ \ haskellLet,
+ \ haskellDefault
+syn region haskellModuleBlock matchgroup=haskellBlockKeywords start="\<module\>" end="\<where\>"
+ \ contains=haskellType,haskellDot,haskellImportList
+syn region haskellClassBlock
+ \ matchgroup=haskellBlockKeywords
+ \ start="^\<\(class\|instance\)\>"
+ \ end="\<where\>\|^\<"
+ \ contains=
+ \ haskellType,
+ \ haskellSeparator,
+ \ haskellParens,
+ \ haskellDot,
+ \ haskellOperators,
+ \ haskellLineComment,
+ \ haskellBlockComment,
+ \ haskellPragma
+syn keyword haskellDeclKeyword newtype data type family instance where contained
+syn region haskellDeclBlock keepend
+ \ start="^\<\(newtype\|data\|type\)\>\s\+\(\<\(family\|instance\)\>\)\?"
+ \ end="\<where\>\|=\|^\<"
+ \ contains=
+ \ haskellDeclKeyword,
+ \ haskellType,
+ \ haskellQuoted,
+ \ haskellParens,
+ \ haskellBrackets,
+ \ haskellDot,
+ \ haskellOperators,
+ \ haskellLineComment,
+ \ haskellBlockComment,
+ \ haskellPragma
+syn match haskellAssocType "\s\+\<\(data\|type\|newtype\)\>"
+syn match haskellDeriving "\(deriving\s\+instance\|deriving\)"
+syn keyword haskellDefault default
+syn keyword haskellImportKeywords import qualified safe as hiding contained
+syn keyword haskellForeignKeywords foreign export import ccall safe unsafe interruptible capi prim contained
+syn region haskellForeignImport start="\<foreign\>" end="::" keepend
+ \ contains=
+ \ haskellString,
+ \ haskellOperators,
+ \ haskellForeignKeywords,
+ \ haskellIdentifier
+syn region haskellImport
+ \ start="^import"
+ \ end="^\<"
+ \ contains=
+ \ haskellImportKeywords,
+ \ haskellImportList,
+ \ haskellType,
+ \ haskellLineComment,
+ \ haskellBlockComment,
+ \ haskellDot
+syn keyword haskellStatement do case of in
+syn keyword haskellWhere where
+syn keyword haskellLet let
+if exists('g:haskell_enable_static_pointers') && g:haskell_enable_static_pointers == 1
+ syn keyword haskellStatic static
+endif
+syn keyword haskellConditional if then else
+syn match haskellNumber "\<[0-9]\+\>\|\<0[xX][0-9a-fA-F]\+\>\|\<0[oO][0-7]\+\>\|\<0[bB][10]\+\>"
+syn match haskellFloat "\<[0-9]\+\.[0-9]\+\([eE][-+]\=[0-9]\+\)\=\>"
+syn match haskellSeparator "[,;]"
+syn region haskellParens matchgroup=haskellDelimiter start="(" end=")" contains=TOP
+syn region haskellBrackets matchgroup=haskellDelimiter start="\[" end="]" contains=TOP
+syn region haskellBlock matchgroup=haskellDelimiter start="{" end="}" contains=TOP
+syn keyword haskellInfix infix infixl infixr
+syn keyword haskellBottom undefined error
+syn match haskellOperators "[-!#$%&\*\+/<=>\?@\\^|~:]\+\|\<_\>"
+syn match haskellQuote "\<'\+" contained
+syn match haskellQuotedType "[A-Z][a-zA-Z0-9_']*\>" contained
+syn region haskellQuoted start="\<'\+" end="\>"
+ \ contains=
+ \ haskellType,
+ \ haskellQuote,
+ \ haskellQuotedType,
+ \ haskellSeparator,
+ \ haskellParens,
+ \ haskellOperators,
+ \ haskellIdentifier
+syn match haskellDot "\."
+syn match haskellLineComment "---*\([^-!#$%&\*\+./<=>\?@\\^|~].*\)\?$"
+ \ contains=
+ \ haskellTodo,
+ \ @Spell
+syn match haskellBacktick "`[A-Za-z_][A-Za-z0-9_\.']*`"
+syn region haskellString start=+"+ skip=+\\\\\|\\"+ end=+"+
+ \ contains=@Spell
+syn match haskellIdentifier "[_a-z][a-zA-z0-9_']*" contained
+syn match haskellChar "\<'[^'\\]'\|'\\.'\|'\\u[0-9a-fA-F]\{4}'\>"
+syn match haskellType "\<[A-Z][a-zA-Z0-9_']*\>\n\?\s*"
+ \ nextgroup=haskellBlockComment,haskellRecordBlock
+syn region haskellBlockComment start="{-" end="-}"
+ \ contains=
+ \ haskellBlockComment,
+ \ haskellTodo,
+ \ @Spell
+syn region haskellPragma start="{-#" end="#-}"
+syn region haskellQuasiQuote matchgroup=haskellTH start="\[[_a-z][a-zA-z0-9_']*|" end="|\]"
+syn region haskellTHBlock matchgroup=haskellTH start="\[\(d\|t\|p\)\?|" end="|]" contains=TOP
+syn region haskellTHDoubleBlock matchgroup=haskellTH start="\[||" end="||]" contains=TOP
+syn match haskellPreProc "^#.*$"
+syn keyword haskellTodo TODO FIXME contained
+if exists('g:haskell_enable_typeroles') && g:haskell_enable_typeroles == 1
+ syn keyword haskellTypeRoles phantom representational nominal contained
+ syn region haskellTypeRoleBlock matchgroup=haskellTypeRoles start="type\s\+role" end="^\<" keepend
+ \ contains=
+ \ haskellType,
+ \ haskellTypeRoles
+endif
+if exists('g:haskell_enable_quantification') && g:haskell_enable_quantification == 1
+ syn keyword haskellForall forall
+endif
+if exists('g:haskell_enable_recursivedo') && g:haskell_enable_recursivedo == 1
+ syn keyword haskellRecursiveDo mdo rec
+endif
+if exists('g:haskell_enable_arrowsyntax') && g:haskell_enable_arrowsyntax == 1
+ syn keyword haskellArrowSyntax proc
+endif
+if exists('g:haskell_enable_pattern_synonyms') && g:haskell_enable_pattern_synonyms == 1
+ syn region haskellPatternSynonym start="^\<pattern\>" end="=\|<-" keepend
+ \ contains=
+ \ haskellPatternKeyword,
+ \ haskellType,
+ \ haskellOperators
+ syn keyword haskellPatternKeyword pattern contained
+endif
- HiLink hsScary Todo
+highlight def link haskellBottom Macro
+highlight def link haskellTH Boolean
+highlight def link haskellBlockKeywords Structure
+highlight def link haskellIdentifier Identifier
+highlight def link haskellForeignKeywords Structure
+highlight def link haskellDeriving Structure
+highlight def link haskellStatement Statement
+highlight def link haskellWhere Statement
+highlight def link haskellLet Statement
+highlight def link haskellDefault Statement
+highlight def link haskellConditional Conditional
+highlight def link haskellNumber Number
+highlight def link haskellFloat Float
+highlight def link haskellSeparator Delimiter
+highlight def link haskellDelimiter Delimiter
+highlight def link haskellInfix PreProc
+highlight def link haskellOperators Operator
+highlight def link haskellQuote Operator
+highlight def link haskellQuotedType Include
+highlight def link haskellDot Operator
+highlight def link haskellType Include
+highlight def link haskellLineComment Comment
+highlight def link haskellBlockComment Comment
+highlight def link haskellPragma SpecialComment
+highlight def link haskellString String
+highlight def link haskellChar String
+highlight def link haskellBacktick Operator
+highlight def link haskellPreProc Macro
+highlight def link haskellTodo Todo
+highlight def link haskellAssocType Structure
+highlight def link haskellImportBlock Delimiter
+highlight def link haskellImportKeywords Structure
+highlight def link haskellDeclKeyword Structure
- delcommand HiLink
+if exists('g:haskell_enable_quantification') && g:haskell_enable_quantification == 1
+ highlight def link haskellForall Operator
+endif
+if exists('g:haskell_enable_recursivedo') && g:haskell_enable_recursivedo == 1
+ highlight def link haskellRecursiveDo Operator
+endif
+if exists('g:haskell_enable_arrowsyntax') && g:haskell_enable_arrowsyntax == 1
+ highlight def link haskellArrowSyntax Operator
+endif
+if exists('g:haskell_enable_pattern_synonyms') && g:haskell_enable_pattern_synonyms == 1
+ highlight def link haskellPatternKeyword Structure
+endif
+if exists('g:haskell_enable_typeroles') && g:haskell_enable_typeroles == 1
+ highlight def link haskellTypeRoles Structure
+endif
+if exists('g:haskell_enable_static_pointers') && g:haskell_enable_static_pointers == 1
+ highlight def link haskellStatic Statement
endif
let b:current_syntax = "haskell"